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 }