29 QByteArray ba(qMax(s.size(), 16), Qt::Uninitialized);
31 auto ba_const_start = [&]() {
return reinterpret_cast<
const uchar *>(ba.constData()); };
32 uchar *cursor =
reinterpret_cast<uchar *>(
const_cast<
char *>(ba.constData()));
33 const uchar *ba_end = cursor + ba.size();
34 const char16_t *src = s.utf16();
35 const char16_t *
const end = s.utf16() + s.size();
38 if (cursor >= ba_end - 6) {
40 qptrdiff pos = cursor - ba_const_start();
41 ba.resize(ba.size()*2);
42 cursor =
reinterpret_cast<uchar *>(ba.data()) + pos;
43 ba_end = ba_const_start() + ba.size();
48 if (u < 0x20 || u == 0x22 || u == 0x5c) {
76 *cursor++ = hexdig(u>>4);
77 *cursor++ = hexdig(u & 0xf);
82 }
else if (QUtf8Functions::toUtf8<QUtf8BaseTraits>(u, cursor, src, end) < 0) {
86 *cursor++ = hexdig(u>>12 & 0x0f);
87 *cursor++ = hexdig(u>>8 & 0x0f);
88 *cursor++ = hexdig(u>>4 & 0x0f);
89 *cursor++ = hexdig(u & 0x0f);
93 ba.resize(cursor - ba_const_start());
99 QCborValue::Type type = v.type();
101 case QCborValue::True:
104 case QCborValue::False:
107 case QCborValue::Integer:
108 json += QByteArray::number(v.toInteger());
110 case QCborValue::Double: {
111 const double d = v.toDouble();
113 json += QByteArray::number(d,
'g', QLocale::FloatingPointShortest);
118 case QCborValue::String:
120 json += escapedString(v.toString());
123 case QCborValue::Array:
124 json += compact ?
"[" :
"[\n";
127 json += QByteArray(4*indent,
' ');
130 case QCborValue::Map:
131 json += compact ?
"{" :
"{\n";
134 json += QByteArray(4*indent,
' ');
137 case QCborValue::Null:
145 if (!a || a->elements.empty())
148 QByteArray indentString(4*indent,
' ');
152 json += indentString;
153 valueContentToJson(a->valueAt(i), json, indent, compact);
155 if (++i == a->elements.size()) {
161 json += compact ?
"," :
",\n";
168 if (!o || o->elements.empty())
171 QByteArray indentString(4*indent,
' ');
176 json += indentString;
178 json += escapedString(o->valueAt(i).toString());
179 json += compact ?
"\":" :
"\": ";
180 valueContentToJson(o->valueAt(i + 1), json, indent, compact);
182 if ((i += 2) == o->elements.size()) {
188 json += compact ?
"," :
",\n";
192void Writer::objectToJson(
const QCborContainerPrivate *o, QByteArray &json,
int indent,
bool compact)
194 json.reserve(json.size() + (o ? (
int)o->elements.size() : 16));
195 json += compact ?
"{" :
"{\n";
196 objectContentToJson(o, json, indent + (compact ? 0 : 1), compact);
197 json += QByteArray(4*indent,
' ');
198 json += compact ?
"}" :
"}\n";
201void Writer::arrayToJson(
const QCborContainerPrivate *a, QByteArray &json,
int indent,
bool compact)
203 json.reserve(json.size() + (a ? (
int)a->elements.size() : 16));
204 json += compact ?
"[" :
"[\n";
205 arrayContentToJson(a, json, indent + (compact ? 0 : 1), compact);
206 json += QByteArray(4*indent,
' ');
207 json += compact ?
"]" :
"]\n";
210void Writer::valueToJson(
const QCborValue &v, QByteArray &json,
int indent,
bool compact)
212 const QCborContainerPrivate *container = QJsonPrivate::Value::container(v);
213 json.reserve(json.size() + (container ? container->elements.size() : 16));
214 valueContentToJson(v, json, indent, compact);
216 if (!compact && (v.isMap() || v.isArray())) {