14#include "arcane/utils/JSONReader.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/ValueConvert.h"
17#include "arcane/utils/CheckedConvert.h"
19#define RAPIDJSON_HAS_STDSTRING 1
20#include "arcane/utils/internal/json/rapidjson/document.h"
21#include "arcane/utils/internal/json/rapidjson/stringbuffer.h"
37 rapidjson::Value::Member* toMember()
const
39 return (rapidjson::Value::Member*)(
this);
46 rapidjson::Value* toValue()
const
48 return (rapidjson::Value*)(
this);
59 static JSONKeyValue build(rapidjson::Value::ConstMemberIterator v)
63 static JSONValue build(rapidjson::Value* v)
90 auto& x = m_p->toMember()->name;
99JSONValue JSONKeyValue::
104 auto& x = m_p->toMember()->value;
105 return JSONWrapperUtils::build(&x);
116 auto x = m_p->toValue();
130 auto x = m_p->toValue();
153 auto x = m_p->toValue();
155 return x->GetInt64();
167 auto x = m_p->toValue();
191 auto x = m_p->toValue();
192 std::cout <<
"TYPE=" << x->GetType() <<
"\n";
194 return x->GetDouble();
195 if (x->GetType()==rapidjson::kStringType){
199 if (!builtInGetValue(r,s))
213 auto d = m_p->toValue();
214 rapidjson::Value::MemberIterator x = d->FindMember((
const char*)(name.
bytes().
data()));
215 if (x==d->MemberEnd())
217 return JSONWrapperUtils::build(x);
226 return keyValueChild(name).value();
237 ARCANE_FATAL(
"No key '{0}' found in json document",name);
249 auto d = m_p->toValue();
253 for(
auto& x : d->GetObject()){
254 auto y = JSONWrapperUtils::build(&x);
255 values.add(y.value());
263JSONValueList JSONValue::
267 return JSONValueList();
268 auto d = m_p->toValue();
269 JSONValueList values;
272 for( rapidjson::SizeType i = 0; i < d->Size(); ++i ){
273 rapidjson::Value& x = (*d)[i];
274 auto y = JSONWrapperUtils::build(&x);
288 auto d = m_p->toValue();
300 auto d = m_p->toValue();
301 return d->IsObject();
307JSONKeyValueList JSONValue::
308keyValueChildren()
const
311 return JSONKeyValueList();
312 auto d = m_p->toValue();
313 JSONKeyValueList values;
314 for(
auto& x : d->GetObject()){
315 auto y = JSONWrapperUtils::build(&x);
330 Impl() : m_document()
334 rapidjson::Document m_document;
355using namespace rapidjson;
358_getErrorCodeString(ParseErrorCode c)
361 case kParseErrorNone:
return "No error";
362 case kParseErrorDocumentEmpty:
return "The document is empty";
363 case kParseErrorDocumentRootNotSingular:
return "The document root must not follow by other values";
364 case kParseErrorValueInvalid:
return "Invalid value";
365 case kParseErrorObjectMissName:
return "Missing a name for object member";
366 case kParseErrorObjectMissColon:
return "Missing a colon after a name of object member";
367 case kParseErrorObjectMissCommaOrCurlyBracket:
return "Missing a comma or '}' after an object member";
368 case kParseErrorArrayMissCommaOrSquareBracket:
return "Missing a comma or ']' after an array element";
369 case kParseErrorStringUnicodeEscapeInvalidHex:
return "Incorrect hex digit after \\u escape in string";
370 case kParseErrorStringUnicodeSurrogateInvalid:
return "The surrogate pair in string is invalid";
371 case kParseErrorStringEscapeInvalid:
return "Invalid escape character in string";
372 case kParseErrorStringMissQuotationMark:
return "Missing a closing quotation mark in string";
373 case kParseErrorStringInvalidEncoding:
return "Invalid encoding in string";
374 case kParseErrorNumberTooBig:
return "Number too big to be stored in double";
375 case kParseErrorNumberMissFraction:
return "Miss fraction part in number";
376 case kParseErrorNumberMissExponent:
return "Miss exponent in number";
377 case kParseErrorTermination:
return "Parsing was terminated";
378 case kParseErrorUnspecificSyntaxError:
return "Unspecific syntax error";
392 using namespace rapidjson;
394 ParseResult r = d.Parse((
const char*)bytes.
data(),bytes.
size());
395 if (d.HasParseError()){
396 std::cout <<
"ERROR: " << d.GetParseError() <<
"\n";
397 ARCANE_FATAL(
"Parsing error file='{0}' ret={1} position={2} message='{3}'",
398 filename,d.GetParseError(),
399 r.Offset(),_getErrorCodeString(r.Code()));
409 parse(bytes,
"(Unknown)");
418 parse(asBytes(bytes));
427 parse(asBytes(bytes),filename);
436 rapidjson::Value& d = m_p->m_document;
437 return JSONWrapperUtils::build(&d);
#define ARCANE_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 valeurs d'un document JSON.
String value() const
Valeur sous forme de String. La chaîne retournée est nulle si 'null()' est vrai.
Int32 valueAsInt32() const
Valeur sous forme de Int64. 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.
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é.
JSONValue child(StringView name) const
Valeur fille de nom name. Retourne une valeur nulle si non trouvé.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
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.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
unsigned char Byte
Type d'un octet.