File indexing completed on 2025-02-02 05:02:30
0001 /* 0002 SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org> 0003 SPDX-License-Identifier: LGPL-2.0-or-later 0004 */ 0005 0006 #include "jsonio.h" 0007 0008 #include <QCborValue> 0009 #include <QJsonArray> 0010 #include <QJsonDocument> 0011 #include <QJsonObject> 0012 #include <QJsonValue> 0013 0014 #include <private/qjson_p.h> 0015 0016 static bool isCbor(const QByteArray &data) 0017 { 0018 return !data.isEmpty() && data[0] != '{' && data[0] != '['; 0019 } 0020 0021 QJsonValue JsonIO::read(const QByteArray &data) 0022 { 0023 if (isCbor(data)) { 0024 return QJsonPrivate::Value::fromTrustedCbor(QCborValue::fromCbor(data)); 0025 } 0026 0027 const auto doc = QJsonDocument::fromJson(data); 0028 if (doc.isArray()) { 0029 return doc.array(); 0030 } 0031 if (doc.isObject()) { 0032 return doc.object(); 0033 } 0034 return {}; 0035 } 0036 0037 QByteArray JsonIO::write(const QJsonValue &value, OutputFormat format) 0038 { 0039 switch (format) { 0040 case JSON: 0041 if (value.isArray()) { 0042 return QJsonDocument(value.toArray()).toJson(QJsonDocument::Compact); 0043 } 0044 if (value.isObject()) { 0045 return QJsonDocument(value.toObject()).toJson(QJsonDocument::Compact); 0046 } 0047 return {}; 0048 case CBOR: 0049 return QCborValue::fromJsonValue(value).toCbor(); 0050 } 0051 return {}; 0052 } 0053 0054 QByteArray JsonIO::convert(const QByteArray &data, OutputFormat format) 0055 { 0056 if (isCbor(data)) { 0057 return format == CBOR ? data : write(read(data), format); 0058 } 0059 return format == JSON ? data : write(read(data), format); 0060 }