6#include <qjsonobject.h>
9#include <qjsondocument.h>
13#include <qstringlist.h>
21#include <private/qnumeric_p.h>
22#include <private/qcborvalue_p.h>
24#include <qcborarray.h>
34 case QCborValue::Null:
35 return QJsonValue::Null;
36 case QCborValue::True:
37 case QCborValue::False:
38 return QJsonValue::Bool;
39 case QCborValue::Double:
40 case QCborValue::Integer:
41 return QJsonValue::Double;
42 case QCborValue::String:
43 return QJsonValue::String;
44 case QCborValue::Array:
45 return QJsonValue::Array;
47 return QJsonValue::Object;
48 case QCborValue::Undefined:
50 return QJsonValue::Undefined;
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
110
111
112
113
114QJsonValue::QJsonValue(Type type)
118 value = QCborValue::Null;
121 value = QCborValue::False;
124 value = QCborValue::Double;
127 value = QCborValue::String;
130 value = QCborValue::Array;
133 value = QCborValue::Map;
141
142
143QJsonValue::QJsonValue(
bool b)
153 if (convertDoubleTo<qint64>(v, &n,
false ))
160
161
162QJsonValue::QJsonValue(
double v)
163 : value(doubleValueHelper(v))
168
169
170
171QJsonValue::QJsonValue(
int v)
177
178
179
180
181
182
183
184
185
186
187QJsonValue::QJsonValue(qint64 v)
193
194
195QJsonValue::QJsonValue(
const QString &s)
201
202
203
204
205
206
207
208
209
210
213
214
215QJsonValue::QJsonValue(QLatin1StringView s)
221
222
223QJsonValue::QJsonValue(
const QJsonArray &a)
224 : value(QCborArray::fromJsonArray(a))
229
230
231
232QJsonValue::QJsonValue(QJsonArray &&a)
noexcept
233 : value(QCborArray::fromJsonArray(std::move(a)))
238
239
240QJsonValue::QJsonValue(
const QJsonObject &o)
241 : value(QCborMap::fromJsonObject(o))
246
247
248
249QJsonValue::QJsonValue(QJsonObject &&o)
noexcept
250 : value(QCborMap::fromJsonObject(std::move(o)))
256
257
258QJsonValue::~QJsonValue() =
default;
261
262
263QJsonValue::QJsonValue(
const QJsonValue &other)
noexcept =
default;
266
267
268QJsonValue &QJsonValue::operator =(
const QJsonValue &other)
noexcept
270 QJsonValue copy(other);
275QJsonValue::QJsonValue(QJsonValue &&other)
noexcept
276 : value(std::move(other.value))
278 other.value = QCborValue(
nullptr);
281void QJsonValue::swap(QJsonValue &other)
noexcept
283 value.swap(other.value);
287
288
289
290
291
294
295
296
297
298
301
302
303
304
307
308
309
310
313
314
315
316
317
318
321
322
323
324
325
326
329
330
331
332
333
334
337
338
339
340
341
342
345
346
347
348
349
350
353
354
355
356
357
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482QJsonValue QJsonValue::fromVariant(
const QVariant &variant)
484 switch (variant.metaType().id()) {
485 case QMetaType::Nullptr:
486 return QJsonValue(Null);
487 case QMetaType::Bool:
488 return QJsonValue(variant.toBool());
489 case QMetaType::Short:
490 case QMetaType::UShort:
492 case QMetaType::UInt:
493 case QMetaType::Long:
494 case QMetaType::LongLong:
495 return QJsonValue(variant.toLongLong());
496 case QMetaType::ULong:
497 case QMetaType::ULongLong:
498 if (variant.toULongLong() <=
static_cast<uint64_t>(std::numeric_limits<qint64>::max()))
499 return QJsonValue(variant.toLongLong());
501 case QMetaType::Float16:
502 case QMetaType::Float:
503 case QMetaType::Double: {
504 double v = variant.toDouble();
505 return qt_is_finite(v) ? QJsonValue(v) : QJsonValue();
507 case QMetaType::QString:
508 return QJsonValue(variant.toString());
509 case QMetaType::QStringList:
510 return QJsonValue(QJsonArray::fromStringList(variant.toStringList()));
511 case QMetaType::QVariantList:
512 return QJsonValue(QJsonArray::fromVariantList(variant.toList()));
513 case QMetaType::QVariantMap:
514 return QJsonValue(QJsonObject::fromVariantMap(variant.toMap()));
515 case QMetaType::QVariantHash:
516 return QJsonValue(QJsonObject::fromVariantHash(variant.toHash()));
517#ifndef QT_BOOTSTRAPPED
518 case QMetaType::QUrl:
519 return QJsonValue(variant.toUrl().toString(QUrl::FullyEncoded));
520 case QMetaType::QUuid:
521 return variant.toUuid().toString(QUuid::WithoutBraces);
522 case QMetaType::QJsonValue:
523 return variant.toJsonValue();
524 case QMetaType::QJsonObject:
525 return variant.toJsonObject();
526 case QMetaType::QJsonArray:
527 return variant.toJsonArray();
528 case QMetaType::QJsonDocument: {
529 QJsonDocument doc = variant.toJsonDocument();
530 return doc.isArray() ? QJsonValue(doc.array()) : QJsonValue(doc.object());
532 case QMetaType::QCborValue:
533 return qvariant_cast<QCborValue>(variant).toJsonValue();
534 case QMetaType::QCborArray:
535 return qvariant_cast<QCborArray>(variant).toJsonArray();
536 case QMetaType::QCborMap:
537 return qvariant_cast<QCborMap>(variant).toJsonObject();
542 QString string = variant.toString();
543 if (string.isEmpty())
545 return QJsonValue(string);
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563QVariant QJsonValue::toVariant()
const
565 switch (value.type()) {
566 case QCborValue::True:
568 case QCborValue::False:
570 case QCborValue::Integer:
572 case QCborValue::Double:
574 case QCborValue::String:
576 case QCborValue::Array:
577 return toArray().toVariantList();
578 case QCborValue::Map:
579 return toObject().toVariantMap();
580 case QCborValue::Null:
581 return QVariant::fromValue(
nullptr);
582 case QCborValue::Undefined:
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
608
609
610
611
612
613
614
615
616
617
618
619QJsonValue QJsonValue::fromJson(QByteArrayView json, QJsonParseError *error)
621 QJsonPrivate::Parser parser(json);
623 result.value = parser.parse(error);
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
649
650
651
652
653
654QByteArray QJsonValue::toJson(JsonFormat format)
const
658 QJsonPrivate::Writer::valueToJson(value, json, 0, (format == JsonFormat::Compact));
664
665
666
667
668QJsonValue::Type QJsonValue::type()
const
670 return convertFromCborType(value.type());
674
675
676
677
678bool QJsonValue::toBool(
bool defaultValue)
const
680 switch (value.type()) {
681 case QCborValue::True:
683 case QCborValue::False:
691
692
693
694
695
696
697int QJsonValue::toInt(
int defaultValue)
const
699 switch (value.type()) {
700 case QCborValue::Double: {
702 if (convertDoubleTo<
int>(toDouble(), &dblInt))
706 case QCborValue::Integer: {
707 const auto n = value.toInteger();
708 if (qint64(
int(n)) == n)
719
720
721
722
723
724
725qint64 QJsonValue::toInteger(qint64 defaultValue)
const
727 switch (value.type()) {
728 case QCborValue::Integer:
729 return value.toInteger();
730 case QCborValue::Double: {
732 if (convertDoubleTo<qint64>(toDouble(), &dblInt))
743
744
745
746
747double QJsonValue::toDouble(
double defaultValue)
const
749 return value.toDouble(defaultValue);
753
754
755
756
757
758
759QString QJsonValue::toString(
const QString &defaultValue)
const
761 return value.toString(defaultValue);
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779QAnyStringView QJsonValue::toStringView(QAnyStringView defaultValue)
const
781 return value.toStringView(defaultValue);
785
786
787
788
789
790
791QString QJsonValue::toString()
const
793 return value.toString();
797
798
799
800
801QJsonArray QJsonValue::toArray(
const QJsonArray &defaultValue)
const
805 QCborContainerPrivate *dd =
nullptr;
806 const auto n = QJsonPrivate::Value::valueHelper(value);
807 const auto container = QJsonPrivate::Value::container(value);
808 Q_ASSERT(n == -1 || container ==
nullptr);
811 return QJsonArray(dd);
815
816
817
818
819
820
821QJsonArray QJsonValue::toArray()
const
823 return toArray(QJsonArray());
827
828
829
830
831QJsonObject QJsonValue::toObject(
const QJsonObject &defaultValue)
const
835 QCborContainerPrivate *dd =
nullptr;
836 const auto container = QJsonPrivate::Value::container(value);
837 const auto n = QJsonPrivate::Value::valueHelper(value);
838 Q_ASSERT(n == -1 || container ==
nullptr);
841 return QJsonObject(dd);
845
846
847
848
849
850
851QJsonObject QJsonValue::toObject()
const
853 return toObject(QJsonObject());
857
858
859
860
861
862
863
864
865
866
867
868const QJsonValue QJsonValue::operator[](
const QString &key)
const
870 return (*
this)[QStringView(key)];
874
875
876
877const QJsonValue QJsonValue::operator[](QStringView key)
const
880 return QJsonValue(QJsonValue::Undefined);
882 return toObject().value(key);
886
887
888
889const QJsonValue QJsonValue::operator[](QLatin1StringView key)
const
892 return QJsonValue(QJsonValue::Undefined);
894 return toObject().value(key);
898
899
900
901
902
903
904
905
906
907
908
909const QJsonValue QJsonValue::operator[](qsizetype i)
const
912 return QJsonValue(QJsonValue::Undefined);
914 return toArray().at(i);
918
919
920
921
924 if (lhs.value.type() != rhs.value.type()) {
925 if (lhs.isDouble() && rhs.isDouble()) {
927 return lhs.toDouble() == rhs.toDouble();
932 switch (lhs.value.type()) {
933 case QCborValue::Undefined:
934 case QCborValue::Null:
935 case QCborValue::True:
936 case QCborValue::False:
938 case QCborValue::Double:
939 return lhs.toDouble() == rhs.toDouble();
940 case QCborValue::Integer:
941 return QJsonPrivate::Value::valueHelper(lhs.value)
942 == QJsonPrivate::Value::valueHelper(rhs.value);
943 case QCborValue::String:
944 return lhs.toString() == rhs.toString();
945 case QCborValue::Array:
946 return lhs.toArray() == rhs.toArray();
947 case QCborValue::Map:
948 return lhs.toObject() == rhs.toObject();
956
957
958
959
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
984void QJsonValueRef::detach()
986#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
987 QCborContainerPrivate *d = QJsonPrivate::Value::container(*
this);
988 d = QCborContainerPrivate::detach(d, d->elements.size());
995 d = QCborContainerPrivate::detach(d, d->elements.size());
1002 qsizetype index = QJsonPrivate::Value::indexHelper(ref);
1003 if (is_object && value.isUndefined()) {
1005 d->removeAt(index - 1);
1007 d->replaceAt(index, value);
1013QJsonValueRef &QJsonValueRef::operator =(
const QJsonValue &val)
1016 return assignToRef(*
this, QCborValue::fromJsonValue(val), is_object);
1019QJsonValueRef &QJsonValueRef::operator =(
const QJsonValueRef &ref)
1022 const QCborContainerPrivate *d = QJsonPrivate::Value::container(ref);
1023 qsizetype index = QJsonPrivate::Value::indexHelper(ref);
1025 if (d == QJsonPrivate::Value::container(*
this) &&
1026 index == QJsonPrivate::Value::indexHelper(*
this))
1030 return assignToRef(*
this, d->valueAt(index), is_object);
1033#ifndef QT_NO_VARIANT
1036 return concrete(*
this).toVariant();
1042 return concrete(*
this).toArray();
1047 return concrete(*
this).toObject();
1052 return convertFromCborType(QJsonPrivate::Value::elementHelper(self).type);
1057 auto &e = QJsonPrivate::Value::elementHelper(self);
1058 if (e.type == QCborValue::False)
1060 if (e.type == QCborValue::True)
1062 return defaultValue;
1067 auto &e = QJsonPrivate::Value::elementHelper(self);
1068 qint64 v = defaultValue;
1069 if (e.type == QCborValue::Double) {
1071 if (!convertDoubleTo<qint64>(e.fpvalue(), &v))
1073 }
else if (e.type == QCborValue::Integer) {
1076 if (clamp && qint64(
int(v)) != v)
1077 return defaultValue;
1083 auto &e = QJsonPrivate::Value::elementHelper(self);
1084 if (e.type == QCborValue::Double)
1086 if (e.type == QCborValue::Integer)
1088 return defaultValue;
1094 qsizetype index = QJsonPrivate::Value::indexHelper(self);
1095 if (d->elements.at(index).type != QCborValue::String)
1096 return defaultValue;
1097 return d->stringAt(index);
1103 const qsizetype index = QJsonPrivate::Value::indexHelper(self);
1104 if (d->elements.at(index).type != QCborValue::String)
1105 return defaultValue;
1106 return d->anyStringViewAt(index);
1112 qsizetype index = QJsonPrivate::Value::indexHelper(self);
1113 return QJsonPrivate::Value::fromTrustedCbor(d->valueAt(index));
1118 Q_ASSERT(self.is_object);
1120 const qsizetype index = QJsonPrivate::Value::indexHelper(self);
1123 Q_ASSERT(index < d->elements.size());
1124 return d->anyStringViewAt(index - 1);
1129 Q_ASSERT(self.is_object);
1131 qsizetype index = QJsonPrivate::Value::indexHelper(self);
1134 Q_ASSERT(index < d->elements.size());
1135 return d->stringAt(index - 1);
1138#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
1139QVariant QJsonValueRef::toVariant()
const
1141 return QJsonValueConstRef::toVariant();
1144QJsonArray QJsonValueRef::toArray()
const
1146 return QJsonValueConstRef::toArray();
1149QJsonObject QJsonValueRef::toObject()
const
1151 return QJsonValueConstRef::toObject();
1154QJsonValue QJsonValueRef::toValue()
const
1156 return concrete(*
this);
1159QJsonValueRef QJsonValueRef::operator[](qsizetype key)
1161 if (d->elements.at(index).type != QCborValue::Array)
1162 d->replaceAt(index, QCborValue::Array);
1164 auto &e = d->elements[index];
1165 e.container = QCborContainerPrivate::grow(e.container, key);
1166 e.flags |= QtCbor::Element::IsContainer;
1168 return QJsonValueRef(e.container, key,
false);
1171QJsonValueRef QJsonValueRef::operator[](QAnyStringView key)
1175 QJsonObject o = QJsonPrivate::Value::fromTrustedCbor(d->valueAt(index)).toObject();
1176 QJsonValueRef ret = key.visit([&](
auto v) {
1177 if constexpr (std::is_same_v<
decltype(v), QUtf8StringView>)
1178 return o[QString::fromUtf8(v)];
1184 QCborContainerPrivate *x = o.o.take();
1185 Q_ASSERT(x->ref.loadRelaxed() == 1);
1187 auto &e = d->elements[index];
1188 if (e.flags & QtCbor::Element::IsContainer && e.container != x)
1189 o.o.reset(e.container);
1191 e.flags |= QtCbor::Element::IsContainer;
1200 switch (value.type()) {
1201 case QJsonValue::Null:
1202 return qHash(
nullptr, seed);
1203 case QJsonValue::Bool:
1204 return qHash(value.toBool(), seed);
1205 case QJsonValue::Double:
1206 return qHash(value.toDouble(), seed);
1207 case QJsonValue::String:
1208 return qHash(value.toString(), seed);
1209 case QJsonValue::Array:
1210 return qHash(value.toArray(), seed);
1211 case QJsonValue::Object:
1212 return qHash(value.toObject(), seed);
1213 case QJsonValue::Undefined:
1216 Q_UNREACHABLE_RETURN(0);
1219#if !defined(QT_NO_DEBUG_STREAM)
1220QDebug operator<<(QDebug dbg,
const QJsonValue &o)
1222 QDebugStateSaver saver(dbg);
1223 switch (o.value.type()) {
1224 case QCborValue::Undefined:
1225 dbg <<
"QJsonValue(undefined)";
1227 case QCborValue::Null:
1228 dbg <<
"QJsonValue(null)";
1230 case QCborValue::True:
1231 case QCborValue::False:
1232 dbg.nospace() <<
"QJsonValue(bool, " << o.toBool() <<
')';
1234 case QCborValue::Integer:
1235 dbg.nospace() <<
"QJsonValue(double, " << o.toInteger() <<
')';
1237 case QCborValue::Double:
1238 dbg.nospace() <<
"QJsonValue(double, " << o.toDouble() <<
')';
1240 case QCborValue::String:
1241 dbg.nospace() <<
"QJsonValue(string, " << o.toString() <<
')';
1243 case QCborValue::Array:
1244 dbg.nospace() <<
"QJsonValue(array, ";
1248 case QCborValue::Map:
1249 dbg.nospace() <<
"QJsonValue(object, ";
1250 dbg << o.toObject();
1260#ifndef QT_NO_DATASTREAM
1261QDataStream &operator<<(QDataStream &stream,
const QJsonValue &v)
1263 quint8 type = v.type();
1266 case QJsonValue::Undefined:
1267 case QJsonValue::Null:
1269 case QJsonValue::Bool:
1270 stream << v.toBool();
1272 case QJsonValue::Double:
1273 stream << v.toDouble();
1275 case QJsonValue::String:
1276 stream << v.toString();
1278 case QJsonValue::Array:
1279 stream << v.toArray();
1281 case QJsonValue::Object:
1282 stream << v.toObject();
1288QDataStream &
operator>>(QDataStream &stream, QJsonValue &v)
1293 case QJsonValue::Undefined:
1294 case QJsonValue::Null:
1295 v = QJsonValue{QJsonValue::Type(type)};
1297 case QJsonValue::Bool: {
1302 }
case QJsonValue::Double: {
1307 }
case QJsonValue::String: {
1313 case QJsonValue::Array: {
1319 case QJsonValue::Object: {
1326 stream.setStatus(QDataStream::ReadCorruptData);
1327 v = QJsonValue{QJsonValue::Undefined};
static const QCborContainerPrivate * container(QJsonValueConstRef r) noexcept
QDataStream & operator>>(QDataStream &stream, QJsonValue &v)
static QJsonValueRef & assignToRef(QJsonValueRef &ref, const QCborValue &value, bool is_object)
static QCborValue doubleValueHelper(double v)
static QT_BEGIN_NAMESPACE QJsonValue::Type convertFromCborType(QCborValue::Type type) noexcept
bool comparesEqual(const QJsonValue &lhs, const QJsonValue &rhs)
size_t qHash(const QJsonValue &value, size_t seed)