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);
276
277
278
279
280
283
284
285
286
287
290
291
292
293
296
297
298
299
302
303
304
305
306
307
310
311
312
313
314
315
318
319
320
321
322
323
326
327
328
329
330
331
334
335
336
337
338
339
342
343
344
345
346
350
351
352
353
354
355
356
357
358
359
360
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
471QJsonValue QJsonValue::fromVariant(
const QVariant &variant)
473 switch (variant.metaType().id()) {
474 case QMetaType::Nullptr:
475 return QJsonValue(Null);
476 case QMetaType::Bool:
477 return QJsonValue(variant.toBool());
478 case QMetaType::Short:
479 case QMetaType::UShort:
481 case QMetaType::UInt:
482 case QMetaType::Long:
483 case QMetaType::LongLong:
484 return QJsonValue(variant.toLongLong());
485 case QMetaType::ULong:
486 case QMetaType::ULongLong:
487 if (variant.toULongLong() <=
static_cast<uint64_t>(std::numeric_limits<qint64>::max()))
488 return QJsonValue(variant.toLongLong());
490 case QMetaType::Float16:
491 case QMetaType::Float:
492 case QMetaType::Double: {
493 double v = variant.toDouble();
494 return qt_is_finite(v) ? QJsonValue(v) : QJsonValue();
496 case QMetaType::QString:
497 return QJsonValue(variant.toString());
498 case QMetaType::QStringList:
499 return QJsonValue(QJsonArray::fromStringList(variant.toStringList()));
500 case QMetaType::QVariantList:
501 return QJsonValue(QJsonArray::fromVariantList(variant.toList()));
502 case QMetaType::QVariantMap:
503 return QJsonValue(QJsonObject::fromVariantMap(variant.toMap()));
504 case QMetaType::QVariantHash:
505 return QJsonValue(QJsonObject::fromVariantHash(variant.toHash()));
506#ifndef QT_BOOTSTRAPPED
507 case QMetaType::QUrl:
508 return QJsonValue(variant.toUrl().toString(QUrl::FullyEncoded));
509 case QMetaType::QUuid:
510 return variant.toUuid().toString(QUuid::WithoutBraces);
511 case QMetaType::QJsonValue:
512 return variant.toJsonValue();
513 case QMetaType::QJsonObject:
514 return variant.toJsonObject();
515 case QMetaType::QJsonArray:
516 return variant.toJsonArray();
517 case QMetaType::QJsonDocument: {
518 QJsonDocument doc = variant.toJsonDocument();
519 return doc.isArray() ? QJsonValue(doc.array()) : QJsonValue(doc.object());
521 case QMetaType::QCborValue:
522 return qvariant_cast<QCborValue>(variant).toJsonValue();
523 case QMetaType::QCborArray:
524 return qvariant_cast<QCborArray>(variant).toJsonArray();
525 case QMetaType::QCborMap:
526 return qvariant_cast<QCborMap>(variant).toJsonObject();
531 QString string = variant.toString();
532 if (string.isEmpty())
534 return QJsonValue(string);
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552QVariant QJsonValue::toVariant()
const
554 switch (value.type()) {
555 case QCborValue::True:
557 case QCborValue::False:
559 case QCborValue::Integer:
561 case QCborValue::Double:
563 case QCborValue::String:
565 case QCborValue::Array:
566 return toArray().toVariantList();
567 case QCborValue::Map:
568 return toObject().toVariantMap();
569 case QCborValue::Null:
570 return QVariant::fromValue(
nullptr);
571 case QCborValue::Undefined:
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
597
598
599
600
601
602
603
604
605
606
607
608QJsonValue QJsonValue::fromJson(QByteArrayView json, QJsonParseError *error)
610 QJsonPrivate::Parser parser(json);
612 result.value = parser.parse(error);
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
638
639
640
641
642
643QByteArray QJsonValue::toJson(JsonFormat format)
const
647 QJsonPrivate::Writer::valueToJson(value, json, 0, (format == JsonFormat::Compact));
653
654
655
656
657QJsonValue::Type QJsonValue::type()
const
659 return convertFromCborType(value.type());
663
664
665
666
667bool QJsonValue::toBool(
bool defaultValue)
const
669 switch (value.type()) {
670 case QCborValue::True:
672 case QCborValue::False:
680
681
682
683
684
685
686int QJsonValue::toInt(
int defaultValue)
const
688 switch (value.type()) {
689 case QCborValue::Double: {
691 if (convertDoubleTo<
int>(toDouble(), &dblInt))
695 case QCborValue::Integer: {
696 const auto n = value.toInteger();
697 if (qint64(
int(n)) == n)
708
709
710
711
712
713
714qint64 QJsonValue::toInteger(qint64 defaultValue)
const
716 switch (value.type()) {
717 case QCborValue::Integer:
718 return value.toInteger();
719 case QCborValue::Double: {
721 if (convertDoubleTo<qint64>(toDouble(), &dblInt))
732
733
734
735
736double QJsonValue::toDouble(
double defaultValue)
const
738 return value.toDouble(defaultValue);
742
743
744
745
746
747
748QString QJsonValue::toString(
const QString &defaultValue)
const
750 return value.toString(defaultValue);
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768QAnyStringView QJsonValue::toStringView(QAnyStringView defaultValue)
const
770 return value.toStringView(defaultValue);
774
775
776
777
778
779
780QString QJsonValue::toString()
const
782 return value.toString();
786
787
788
789
790QJsonArray QJsonValue::toArray(
const QJsonArray &defaultValue)
const
794 QCborContainerPrivate *dd =
nullptr;
795 const auto n = QJsonPrivate::Value::valueHelper(value);
796 const auto container = QJsonPrivate::Value::container(value);
797 Q_ASSERT(n == -1 || container ==
nullptr);
800 return QJsonArray(dd);
804
805
806
807
808
809
810QJsonArray QJsonValue::toArray()
const
812 return toArray(QJsonArray());
816
817
818
819
820QJsonObject QJsonValue::toObject(
const QJsonObject &defaultValue)
const
824 QCborContainerPrivate *dd =
nullptr;
825 const auto container = QJsonPrivate::Value::container(value);
826 const auto n = QJsonPrivate::Value::valueHelper(value);
827 Q_ASSERT(n == -1 || container ==
nullptr);
830 return QJsonObject(dd);
834
835
836
837
838
839
840QJsonObject QJsonValue::toObject()
const
842 return toObject(QJsonObject());
846
847
848
849
850
851
852
853
854
855
856
857const QJsonValue QJsonValue::operator[](
const QString &key)
const
859 return (*
this)[QStringView(key)];
863
864
865
866const QJsonValue QJsonValue::operator[](QStringView key)
const
869 return QJsonValue(QJsonValue::Undefined);
871 return toObject().value(key);
875
876
877
878const QJsonValue QJsonValue::operator[](QLatin1StringView key)
const
881 return QJsonValue(QJsonValue::Undefined);
883 return toObject().value(key);
887
888
889
890
891
892
893
894
895
896
897
898const QJsonValue QJsonValue::operator[](qsizetype i)
const
901 return QJsonValue(QJsonValue::Undefined);
903 return toArray().at(i);
907
908
909
910
913 if (lhs.value.type() != rhs.value.type()) {
914 if (lhs.isDouble() && rhs.isDouble()) {
916 return lhs.toDouble() == rhs.toDouble();
921 switch (lhs.value.type()) {
922 case QCborValue::Undefined:
923 case QCborValue::Null:
924 case QCborValue::True:
925 case QCborValue::False:
927 case QCborValue::Double:
928 return lhs.toDouble() == rhs.toDouble();
929 case QCborValue::Integer:
930 return QJsonPrivate::Value::valueHelper(lhs.value)
931 == QJsonPrivate::Value::valueHelper(rhs.value);
932 case QCborValue::String:
933 return lhs.toString() == rhs.toString();
934 case QCborValue::Array:
935 return lhs.toArray() == rhs.toArray();
936 case QCborValue::Map:
937 return lhs.toObject() == rhs.toObject();
945
946
947
948
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
973void QJsonValueRef::detach()
975#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
976 QCborContainerPrivate *d = QJsonPrivate::Value::container(*
this);
977 d = QCborContainerPrivate::detach(d, d->elements.size());
984 d = QCborContainerPrivate::detach(d, d->elements.size());
991 qsizetype index = QJsonPrivate::Value::indexHelper(ref);
992 if (is_object && value.isUndefined()) {
994 d->removeAt(index - 1);
996 d->replaceAt(index, value);
1002QJsonValueRef &QJsonValueRef::operator =(
const QJsonValue &val)
1005 return assignToRef(*
this, QCborValue::fromJsonValue(val), is_object);
1008QJsonValueRef &QJsonValueRef::operator =(
const QJsonValueRef &ref)
1011 const QCborContainerPrivate *d = QJsonPrivate::Value::container(ref);
1012 qsizetype index = QJsonPrivate::Value::indexHelper(ref);
1014 if (d == QJsonPrivate::Value::container(*
this) &&
1015 index == QJsonPrivate::Value::indexHelper(*
this))
1019 return assignToRef(*
this, d->valueAt(index), is_object);
1022#ifndef QT_NO_VARIANT
1025 return concrete(*
this).toVariant();
1031 return concrete(*
this).toArray();
1036 return concrete(*
this).toObject();
1041 return convertFromCborType(QJsonPrivate::Value::elementHelper(self).type);
1046 auto &e = QJsonPrivate::Value::elementHelper(self);
1047 if (e.type == QCborValue::False)
1049 if (e.type == QCborValue::True)
1051 return defaultValue;
1056 auto &e = QJsonPrivate::Value::elementHelper(self);
1057 qint64 v = defaultValue;
1058 if (e.type == QCborValue::Double) {
1060 if (!convertDoubleTo<qint64>(e.fpvalue(), &v))
1062 }
else if (e.type == QCborValue::Integer) {
1065 if (clamp && qint64(
int(v)) != v)
1066 return defaultValue;
1072 auto &e = QJsonPrivate::Value::elementHelper(self);
1073 if (e.type == QCborValue::Double)
1075 if (e.type == QCborValue::Integer)
1077 return defaultValue;
1083 qsizetype index = QJsonPrivate::Value::indexHelper(self);
1084 if (d->elements.at(index).type != QCborValue::String)
1085 return defaultValue;
1086 return d->stringAt(index);
1092 const qsizetype index = QJsonPrivate::Value::indexHelper(self);
1093 if (d->elements.at(index).type != QCborValue::String)
1094 return defaultValue;
1095 return d->anyStringViewAt(index);
1101 qsizetype index = QJsonPrivate::Value::indexHelper(self);
1102 return QJsonPrivate::Value::fromTrustedCbor(d->valueAt(index));
1107 Q_ASSERT(self.is_object);
1109 const qsizetype index = QJsonPrivate::Value::indexHelper(self);
1112 Q_ASSERT(index < d->elements.size());
1113 return d->anyStringViewAt(index - 1);
1118 Q_ASSERT(self.is_object);
1120 qsizetype index = QJsonPrivate::Value::indexHelper(self);
1123 Q_ASSERT(index < d->elements.size());
1124 return d->stringAt(index - 1);
1127#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
1128QVariant QJsonValueRef::toVariant()
const
1130 return QJsonValueConstRef::toVariant();
1133QJsonArray QJsonValueRef::toArray()
const
1135 return QJsonValueConstRef::toArray();
1138QJsonObject QJsonValueRef::toObject()
const
1140 return QJsonValueConstRef::toObject();
1143QJsonValue QJsonValueRef::toValue()
const
1145 return concrete(*
this);
1148QJsonValueRef QJsonValueRef::operator[](qsizetype key)
1150 if (d->elements.at(index).type != QCborValue::Array)
1151 d->replaceAt(index, QCborValue::Array);
1153 auto &e = d->elements[index];
1154 e.container = QCborContainerPrivate::grow(e.container, key);
1155 e.flags |= QtCbor::Element::IsContainer;
1157 return QJsonValueRef(e.container, key,
false);
1160QJsonValueRef QJsonValueRef::operator[](QAnyStringView key)
1164 QJsonObject o = QJsonPrivate::Value::fromTrustedCbor(d->valueAt(index)).toObject();
1165 QJsonValueRef ret = key.visit([&](
auto v) {
1166 if constexpr (std::is_same_v<
decltype(v), QUtf8StringView>)
1167 return o[QString::fromUtf8(v)];
1173 QCborContainerPrivate *x = o.o.take();
1174 Q_ASSERT(x->ref.loadRelaxed() == 1);
1176 auto &e = d->elements[index];
1177 if (e.flags & QtCbor::Element::IsContainer && e.container != x)
1178 o.o.reset(e.container);
1180 e.flags |= QtCbor::Element::IsContainer;
1189 switch (value.type()) {
1190 case QJsonValue::Null:
1191 return qHash(
nullptr, seed);
1192 case QJsonValue::Bool:
1193 return qHash(value.toBool(), seed);
1194 case QJsonValue::Double:
1195 return qHash(value.toDouble(), seed);
1196 case QJsonValue::String:
1197 return qHash(value.toString(), seed);
1198 case QJsonValue::Array:
1199 return qHash(value.toArray(), seed);
1200 case QJsonValue::Object:
1201 return qHash(value.toObject(), seed);
1202 case QJsonValue::Undefined:
1205 Q_UNREACHABLE_RETURN(0);
1208#if !defined(QT_NO_DEBUG_STREAM)
1209QDebug operator<<(QDebug dbg,
const QJsonValue &o)
1211 QDebugStateSaver saver(dbg);
1212 switch (o.value.type()) {
1213 case QCborValue::Undefined:
1214 dbg <<
"QJsonValue(undefined)";
1216 case QCborValue::Null:
1217 dbg <<
"QJsonValue(null)";
1219 case QCborValue::True:
1220 case QCborValue::False:
1221 dbg.nospace() <<
"QJsonValue(bool, " << o.toBool() <<
')';
1223 case QCborValue::Integer:
1224 dbg.nospace() <<
"QJsonValue(double, " << o.toInteger() <<
')';
1226 case QCborValue::Double:
1227 dbg.nospace() <<
"QJsonValue(double, " << o.toDouble() <<
')';
1229 case QCborValue::String:
1230 dbg.nospace() <<
"QJsonValue(string, " << o.toString() <<
')';
1232 case QCborValue::Array:
1233 dbg.nospace() <<
"QJsonValue(array, ";
1237 case QCborValue::Map:
1238 dbg.nospace() <<
"QJsonValue(object, ";
1239 dbg << o.toObject();
1249#ifndef QT_NO_DATASTREAM
1250QDataStream &operator<<(QDataStream &stream,
const QJsonValue &v)
1252 quint8 type = v.type();
1255 case QJsonValue::Undefined:
1256 case QJsonValue::Null:
1258 case QJsonValue::Bool:
1259 stream << v.toBool();
1261 case QJsonValue::Double:
1262 stream << v.toDouble();
1264 case QJsonValue::String:
1265 stream << v.toString();
1267 case QJsonValue::Array:
1268 stream << v.toArray();
1270 case QJsonValue::Object:
1271 stream << v.toObject();
1277QDataStream &
operator>>(QDataStream &stream, QJsonValue &v)
1282 case QJsonValue::Undefined:
1283 case QJsonValue::Null:
1284 v = QJsonValue{QJsonValue::Type(type)};
1286 case QJsonValue::Bool: {
1291 }
case QJsonValue::Double: {
1296 }
case QJsonValue::String: {
1302 case QJsonValue::Array: {
1308 case QJsonValue::Object: {
1315 stream.setStatus(QDataStream::ReadCorruptData);
1316 v = QJsonValue{QJsonValue::Undefined};
static const QCborContainerPrivate * container(QJsonValueConstRef r) noexcept
Combined button and popup list for selecting options.
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)