5#include <QtCore/QObject>
6#include <QtCore/QJsonParseError>
16QString jsonValueTypeToString(QJsonValue::Type type)
20 QJsonValue::Type type;
24 static constexpr const TypeToString typeToStringMap[] = {
25 {QJsonValue::Null,
"NULL"}, {QJsonValue::Bool,
"Bool"}, {QJsonValue::Double,
"Double"},
26 {QJsonValue::String,
"String"}, {QJsonValue::Array,
"Array"}, {QJsonValue::Object,
"Object"},
27 {QJsonValue::Undefined,
"Undefined"},
30 for (
const TypeToString& entry : typeToStringMap) {
31 if (type == entry.type) {
36 return QObject::tr(
"Unknown type: %1").arg(type);
47 for (
const QString& key : keys) {
48 if (!jsonObject.contains(key)) {
49 if (!missingKeys.isEmpty()) {
50 missingKeys += QStringLiteral(
", ");
56 if (!missingKeys.isEmpty()) {
57 errorString = QObject::tr(
"The following required keys are missing: %1").arg(missingKeys);
64bool validateKeyTypes(
const QJsonObject& jsonObject,
const QStringList& keys,
const QList<QJsonValue::Type>& types,
67 if (keys.count() != types.count()) {
68 errorString = QObject::tr(
"Mismatched key and type list sizes: keys=%1 types=%2")
69 .arg(keys.count()).arg(types.count());
73 for (qsizetype i = 0; i < types.count(); i++) {
74 const QString& valueKey = keys[i];
75 if (jsonObject.contains(valueKey)) {
76 const QJsonValue& jsonValue = jsonObject[valueKey];
77 if ((jsonValue.type() == QJsonValue::Double) && (types[i] == QJsonValue::Null)) {
81 if (jsonValue.type() != types[i]) {
82 errorString = QObject::tr(
"Incorrect value type - key:type:expected %1:%2:%3")
83 .arg(valueKey, jsonValueTypeToString(jsonValue.type()),
84 jsonValueTypeToString(types[i]));
95 QJsonParseError parseError;
98 if (parseError.error == QJsonParseError::NoError) {
102 const int startPos = qMax(0, parseError.offset - 100);
103 const int length = qMin(bytes.length() - startPos, 200);
104 qCDebug(JsonParsingLog) <<
"Json read error" << bytes.mid(startPos, length).constData();
113 if (jsonBytes.isEmpty() && !
errorString.isEmpty()) {
122 if (value.type() == QJsonValue::Null) {
123 return std::numeric_limits<double>::quiet_NaN();
126 return value.toDouble();
#define QGC_LOGGING_CATEGORY(name, categoryStr)
bool validateKeyTypes(const QJsonObject &jsonObject, const QStringList &keys, const QList< QJsonValue::Type > &types, QString &errorString)
bool isJsonFile(const QByteArray &bytes, QJsonDocument &jsonDoc, QString &errorString)
Determines whether an in-memory byte buffer contains parseable JSON content.
double possibleNaNJsonValue(const QJsonValue &value)
Returns NaN if the value is null, or the value converted to double otherwise.
bool validateRequiredKeys(const QJsonObject &jsonObject, const QStringList &keys, QString &errorString)
Validates that all listed keys are present in the object.
QByteArray readFile(const QString &filePath, QString *errorString, qint64 maxBytes)
QJsonDocument parseCompressedJson(const QByteArray &data, QJsonParseError *error)