14#include "arccore/common/JSONReader.h"
16#include "arccore/base/FatalErrorException.h"
17#include "arccore/base/CheckedConvert.h"
18#include "arccore/base/internal/ConvertInternal.h"
20#define RAPIDJSON_HAS_STDSTRING 1
21#include "arccore/common/internal/json/rapidjson/document.h"
22#include "arccore/common/internal/json/rapidjson/stringbuffer.h"
39 rapidjson::Value::Member* toMember()
const
41 return (rapidjson::Value::Member*)(
this);
49 rapidjson::Value* toValue()
const
51 return (rapidjson::Value*)(
this);
63 static JSONKeyValue build(rapidjson::Value::ConstMemberIterator v)
67 static JSONValue build(rapidjson::Value* v)
94 auto& x = m_p->toMember()->name;
103JSONValue JSONKeyValue::
108 auto& x = m_p->toMember()->value;
109 return JSONWrapperUtils::build(&x);
120 auto x = m_p->toValue();
134 auto x = m_p->toValue();
157 auto x = m_p->toValue();
159 return x->GetInt64();
171 auto x = m_p->toValue();
184 return CheckedConvert::toInt32(v);
195 auto x = m_p->toValue();
197 return x->GetDouble();
198 if (x->GetType() == rapidjson::kStringType) {
202 if (!Convert::Impl::StringViewToIntegral::getValue(r, s))
216 auto x = m_p->toValue();
218 return x->GetUint64();
230 auto d = m_p->toValue();
231 rapidjson::Value::MemberIterator x = d->FindMember((
const char*)(name.
bytes().
data()));
232 if (x == d->MemberEnd())
234 return JSONWrapperUtils::build(x);
243 return keyValueChild(name).
value();
252 JSONKeyValue k = keyValueChild(name);
266 auto d = m_p->toValue();
270 for (
auto& x : d->GetObject()) {
271 auto y = JSONWrapperUtils::build(&x);
272 values.add(y.value());
284 return JSONValueList();
285 auto d = m_p->toValue();
286 JSONValueList values;
289 for (rapidjson::SizeType i = 0; i < d->Size(); ++i) {
290 rapidjson::Value& x = (*d)[i];
291 auto y = JSONWrapperUtils::build(&x);
305 auto d = m_p->toValue();
317 auto d = m_p->toValue();
318 return d->IsObject();
325keyValueChildren()
const
328 return JSONKeyValueList();
329 auto d = m_p->toValue();
330 JSONKeyValueList values;
331 for (
auto& x : d->GetObject()) {
332 auto y = JSONWrapperUtils::build(&x);
343 return m_p->toValue()->IsNull();
351 return m_p->toValue()->IsBool();
359 return m_p->toValue()->IsString();
367 return m_p->toValue()->IsNumber();
375 return m_p->toValue()->IsInt64();
383 return m_p->toValue()->IsUint64();
403 rapidjson::Document m_document;
423 using namespace rapidjson;
426 _getErrorCodeString(ParseErrorCode c)
429 case kParseErrorNone:
431 case kParseErrorDocumentEmpty:
432 return "The document is empty";
433 case kParseErrorDocumentRootNotSingular:
434 return "The document root must not follow by other values";
435 case kParseErrorValueInvalid:
436 return "Invalid value";
437 case kParseErrorObjectMissName:
438 return "Missing a name for object member";
439 case kParseErrorObjectMissColon:
440 return "Missing a colon after a name of object member";
441 case kParseErrorObjectMissCommaOrCurlyBracket:
442 return "Missing a comma or '}' after an object member";
443 case kParseErrorArrayMissCommaOrSquareBracket:
444 return "Missing a comma or ']' after an array element";
445 case kParseErrorStringUnicodeEscapeInvalidHex:
446 return "Incorrect hex digit after \\u escape in string";
447 case kParseErrorStringUnicodeSurrogateInvalid:
448 return "The surrogate pair in string is invalid";
449 case kParseErrorStringEscapeInvalid:
450 return "Invalid escape character in string";
451 case kParseErrorStringMissQuotationMark:
452 return "Missing a closing quotation mark in string";
453 case kParseErrorStringInvalidEncoding:
454 return "Invalid encoding in string";
455 case kParseErrorNumberTooBig:
456 return "Number too big to be stored in double";
457 case kParseErrorNumberMissFraction:
458 return "Miss fraction part in number";
459 case kParseErrorNumberMissExponent:
460 return "Miss exponent in number";
461 case kParseErrorTermination:
462 return "Parsing was terminated";
463 case kParseErrorUnspecificSyntaxError:
464 return "Unspecific syntax error";
478 using namespace rapidjson;
479 Document& d = m_p->m_document;
480 ParseResult r = d.Parse((
const char*)bytes.
data(), bytes.
size());
481 if (d.HasParseError()) {
482 std::cout <<
"ERROR: " << d.GetParseError() <<
"\n";
483 ARCCORE_FATAL(
"Parsing error file='{0}' ret={1} position={2} message='{3}'",
484 filename, d.GetParseError(),
485 r.Offset(), _getErrorCodeString(r.Code()));
495 parse(bytes,
"(Unknown)");
522 rapidjson::Value& d = m_p->m_document;
523 return JSONWrapperUtils::build(&d);
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
void parse(Span< const Byte > bytes)
Lit le fichier au format UTF-8.
JSONValue root() const
Elément racine.
Liste de (clé,valeur) d'un document JSON.
Liste de valeurs d'un document JSON.
String value() const
Valeur sous forme de String. La chaîne retournée est nulle si 'null()' est vrai.
bool isUint64() const
Vrai si la valeur est un entier dans la plage 'UInt64'.
UInt64 valueAsUInt64() const
Valeur sous forme de UInt64. Retourn 0 si 'null()' est vrai.
Int32 valueAsInt32() const
Valeur sous forme de Int32. Retourn 0 si 'null()' est vrai.
Real valueAsReal() const
Valeur sous forme de Real. Retourn 0.0 si 'null()' est vrai.
bool valueAsBool() const
Valeur sous forme de booléen. Retourn false si 'null()' est vrai.
Int64 valueAsInt64() const
Valeur sous forme de Int64. Retourn 0 si 'null()' est vrai.
bool isInt64() const
Vrai si la valeur est un entier dans la plage 'Int64'.
StringView valueAsStringView() const
Valeur sous forme de StringView. La chaîne est vide si 'null()' est vrai.
JSONValue expectedChild(StringView name) const
Valeur fille de nom name. Lance une exception si non trouvé.
bool isBool() const
Vrai si la valeur est un booléen.
bool isString() const
Vrai si la valeur est une chaîne de caractères.
bool isNull() const
Vrai si la valeur est de type 'null'.
JSONValue child(StringView name) const
Valeur fille de nom name. Retourne une valeur nulle si non trouvé.
bool isNumber() const
Vrai si la valeur est un nombre.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
Vue sur une chaîne de caractères UTF-8.
constexpr Span< const Byte > bytes() const ARCCORE_NOEXCEPT
Retourne la conversion de l'instance dans l'encodage UTF-8.
Chaîne de caractères unicode.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::uint64_t UInt64
Type entier non signé sur 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
double Real
Type représentant un réel.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Convertit la vue en un tableau d'octets non modifiables.
unsigned char Byte
Type d'un octet.
std::int32_t Int32
Type entier signé sur 32 bits.