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();
196 std::cout <<
"TYPE=" << x->GetType() <<
"\n";
198 return x->GetDouble();
199 if (x->GetType() == rapidjson::kStringType) {
203 if (!Convert::Impl::StringViewToIntegral::getValue(r, s))
217 auto d = m_p->toValue();
218 rapidjson::Value::MemberIterator x = d->FindMember((
const char*)(name.
bytes().
data()));
219 if (x == d->MemberEnd())
221 return JSONWrapperUtils::build(x);
230 return keyValueChild(name).
value();
239 JSONKeyValue k = keyValueChild(name);
253 auto d = m_p->toValue();
257 for (
auto& x : d->GetObject()) {
258 auto y = JSONWrapperUtils::build(&x);
259 values.add(y.value());
271 return JSONValueList();
272 auto d = m_p->toValue();
273 JSONValueList values;
276 for (rapidjson::SizeType i = 0; i < d->Size(); ++i) {
277 rapidjson::Value& x = (*d)[i];
278 auto y = JSONWrapperUtils::build(&x);
292 auto d = m_p->toValue();
304 auto d = m_p->toValue();
305 return d->IsObject();
312keyValueChildren()
const
315 return JSONKeyValueList();
316 auto d = m_p->toValue();
317 JSONKeyValueList values;
318 for (
auto& x : d->GetObject()) {
319 auto y = JSONWrapperUtils::build(&x);
342 rapidjson::Document m_document;
363 using namespace rapidjson;
366 _getErrorCodeString(ParseErrorCode c)
369 case kParseErrorNone:
371 case kParseErrorDocumentEmpty:
372 return "The document is empty";
373 case kParseErrorDocumentRootNotSingular:
374 return "The document root must not follow by other values";
375 case kParseErrorValueInvalid:
376 return "Invalid value";
377 case kParseErrorObjectMissName:
378 return "Missing a name for object member";
379 case kParseErrorObjectMissColon:
380 return "Missing a colon after a name of object member";
381 case kParseErrorObjectMissCommaOrCurlyBracket:
382 return "Missing a comma or '}' after an object member";
383 case kParseErrorArrayMissCommaOrSquareBracket:
384 return "Missing a comma or ']' after an array element";
385 case kParseErrorStringUnicodeEscapeInvalidHex:
386 return "Incorrect hex digit after \\u escape in string";
387 case kParseErrorStringUnicodeSurrogateInvalid:
388 return "The surrogate pair in string is invalid";
389 case kParseErrorStringEscapeInvalid:
390 return "Invalid escape character in string";
391 case kParseErrorStringMissQuotationMark:
392 return "Missing a closing quotation mark in string";
393 case kParseErrorStringInvalidEncoding:
394 return "Invalid encoding in string";
395 case kParseErrorNumberTooBig:
396 return "Number too big to be stored in double";
397 case kParseErrorNumberMissFraction:
398 return "Miss fraction part in number";
399 case kParseErrorNumberMissExponent:
400 return "Miss exponent in number";
401 case kParseErrorTermination:
402 return "Parsing was terminated";
403 case kParseErrorUnspecificSyntaxError:
404 return "Unspecific syntax error";
418 using namespace rapidjson;
419 Document& d = m_p->m_document;
420 ParseResult r = d.Parse((
const char*)bytes.
data(), bytes.
size());
421 if (d.HasParseError()) {
422 std::cout <<
"ERROR: " << d.GetParseError() <<
"\n";
423 ARCCORE_FATAL(
"Parsing error file='{0}' ret={1} position={2} message='{3}'",
424 filename, d.GetParseError(),
425 r.Offset(), _getErrorCodeString(r.Code()));
435 parse(bytes,
"(Unknown)");
462 rapidjson::Value& d = m_p->m_document;
463 return JSONWrapperUtils::build(&d);
#define ARCCORE_FATAL(...)
Macro throwing a FatalErrorException.
void parse(Span< const Byte > bytes)
Reads the file in UTF-8 format.
JSONValue root() const
Root element.
List of (key,value) pairs of a JSON document.
List of values of a JSON document.
String value() const
Value in String format. The returned string is null if 'null()' is true.
Int32 valueAsInt32() const
Value in Int64 format. Returns 0 if 'null()' is true.
Real valueAsReal() const
Value in Real format. Returns 0.0 if 'null()' is true.
bool valueAsBool() const
Value in boolean format. Returns false if 'null()' is true.
Int64 valueAsInt64() const
Value in Int64 format. Returns 0 if 'null()' is true.
StringView valueAsStringView() const
Value in StringView format. The string is empty if 'null()' is true.
JSONValue expectedChild(StringView name) const
Child value with name name. Throws an exception if not found.
JSONValue child(StringView name) const
Child value with name name. Returns a null value if not found.
constexpr __host__ __device__ pointer data() const noexcept
Pointer to the start of the view.
constexpr __host__ __device__ SizeType size() const noexcept
Returns the size of the array.
View of an array of elements of type T.
View of a UTF-8 character string.
constexpr Span< const Byte > bytes() const ARCCORE_NOEXCEPT
Returns the conversion of the instance in UTF-8 encoding.
Unicode character string.
constexpr __host__ __device__ pointer data() const noexcept
Pointer to the start of the view.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
double Real
Type representing a real number.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converts the view into an array of non-modifiable bytes.
unsigned char Byte
Type of a byte.
std::int32_t Int32
Signed integer type of 32 bits.