首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按顺序获得QJsonObject值?

如何按顺序获得QJsonObject值?
EN

Stack Overflow用户
提问于 2016-08-27 13:42:10
回答 1查看 3.4K关注 0票数 2

我想在Qt中使用Json,而且我在QJsonObject中的数据必须以某种特定的顺序排列,因为我们有一些通过令牌和获取Json哈希的确认方法。

由于QJsonObject按字母顺序对其键值对进行排序,所以会发生这样的情况:

代码语言:javascript
复制
QJsonObject object;
object.insert("B","b");
object.insert("A","a");
qDebug() << QJsonDocument(object).toJson(); // this-line

我希望这行打印出如下内容:

代码语言:javascript
复制
{"B":"b","A":"a"}

但我明白了:

代码语言:javascript
复制
{
    "A":"a",
    "B":"b"
}

我写了一堂课:

jsonobject.h

代码语言:javascript
复制
class JsonObject
{
public:
    JsonObject();
    void insert(QString key,QJsonValue value);
    void remove(QString key);
    QString toJsonString();
    QString convertQJsonValue2String(QJsonValue value);
    QString convertQJsonArray2String(QJsonArray array);
    QString convertQJsonObject2String(QJsonObject object);
private:
    void appendKey(QString key,QString * out);
    QJsonObject qJsonObject;
    QStringList keysInOrder;
};

jsonobject.cpp

代码语言:javascript
复制
#include "jsonobject.h"

JsonObject::JsonObject()
{
    keysInOrder.clear();
}

void JsonObject::insert(QString key, QJsonValue value)
{
    if(!keysInOrder.contains(key))
        keysInOrder.append(key);
    qJsonObject.insert(key,value);
}

void JsonObject::remove(QString key)
{
    keysInOrder.removeOne(key);
qJsonObject.remove(key);
}

QString JsonObject::toJsonString()
{
    QString out;
    for(int i = 0 ; i < keysInOrder.size() ; i++)
    {
        appendKey(keysInOrder[i],&out);
        out.append(convertQJsonValue2String(qJsonObject.value(keysInOrder[i])));
        if(i != (keysInOrder.size() - 1))
            out.append(",");
    }
    return out.prepend("{").append("}");
}

QString JsonObject::convertQJsonObject2String(QJsonObject object)
{
    QStringList keys = object.keys();
    QString out;
    for(int i = 0 ; i < keys.size() ; i++)
    {
        appendKey(keys[i],&out);
        out.append(convertQJsonValue2String(object[keys[i]]));
        if(i != keys.size() - 1)
            out.append(",");
    }
    return out.prepend("{").append("}");
}

void JsonObject::appendKey(QString key, QString *out)
{
    out->append("\"");
    out->append(key);
    out->append("\"");
    out->append(":");
}

QString JsonObject::convertQJsonValue2String(QJsonValue value)
{
    switch(value.type())
    {
    case QJsonValue::Null:
        return QString("null");
        break;
    case QJsonValue::Bool:
        return QString("%1").arg(value.toBool());
        break;
    case QJsonValue::Double:
        return QString("%1").arg(value.toDouble());
        break;
    case QJsonValue::String:
        return value.toString().prepend("\"").append("\"");
        break;
    case QJsonValue::Object:
        return convertQJsonObject2String(value.toObject());
        break;
    case QJsonValue::Array:
        return convertQJsonArray2String(value.toArray());
        break;
    case QJsonValue::Undefined:
        return QString();
        break;
    }
    return QString();
}

QString JsonObject::convertQJsonArray2String(QJsonArray array)
{
    QString out;
    for(int i = 0 ; i < array.size() ; i++)
    {
        QJsonValue value = array.at(i);
        out.append(convertQJsonValue2String(value));
        if(i != (array.size() - 1))
            out.append(",");
    }
    return out.prepend("[").append("]");
}

这里的问题是,我有QJsonObjects在里面,而我的converQJSonObject2String(QJsonObject object)仍然没有这个顺序。

EN

回答 1

Stack Overflow用户

发布于 2016-08-28 17:56:06

在我看来,这看起来就像你试图用json来做一些它不打算做的事情。Json没有规范的表示形式,因此即使您能够正确地对键进行排序,您也可能会遇到问题。(带有非ascii字符的键,空格差异,.)

虽然您当然可以做您想要的事情(我建议使用另一个提供这种可能性的库),但是请后退一步,考虑一下您想要实现的目标。

您是否可以直接从服务器接收到json的散列?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39181796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档