通过其子元素之一对QJsonArray进行排序

时间:2019-01-31 13:30:27

标签: c++ json qt sorting

如何根据QJsonArray的子项对它进行自定义排序?

我有基于此JSON的QJsonArray toys

"toys": [
    {
        "type": "teddy",
        "name": "Thomas",
        "size": 24
    },
    {
        "type": "giraffe",
        "name": "Jenny",
        "size": 28
    },
    {
        "type": "alligator",
        "name": "Alex",
        "size": 12
    }
]

我想按"name"的字母顺序对其进行排序。

我尝试过:

std::sort(toys.begin(), toys.end(), [](const QJsonObject &v1, const QJsonObject &v2) {
    return v1["name"].toString() < v2["name"].toString();
});

但这会引发很多错误。

1 个答案:

答案 0 :(得分:0)

有几件事需要修复。首先,这是我的解决方案,下面有一些解释:

解决方案

inline void swap(QJsonValueRef v1, QJsonValueRef v2)
{
    QJsonValue temp(v1);
    v1 = QJsonValue(v2);
    v2 = temp;
}

std::sort(toys.begin(), toys.end(), [](const QJsonValue &v1, const QJsonValue &v2) {
    return v1.toObject()["name"].toString() < v2.toObject()["name"].toString();
});

说明

比较参数

您遇到的错误之一是:

no matching function for call to object of type '(lambda at xxxxxxxx)'
        if (__comp(*--__last, *__first))
            ^~~~~~

...

candidate function not viable: no known conversion from 'QJsonValueRef' to 'const QJsonObject' for 1st argument
std::sort(toys.begin(), toys.end(), [](const QJsonObject &v1, const QJsonObject &v2) {
                                    ^
...

迭代器不知道您的数组元素的类型为QJsonObject。相反,它将它们视为通用QJsonValue类型。无法自动转换为QJsonObject,因此lambda函数会引发错误。

将两个lambda参数的const QJsonObject &替换为const QJsonValue &。然后在函数体中显式处理转换为QJsonObject类型的内容:v1.toObject()...而不是v1...

没有交换功能!

您遇到的错误之一是:

no matching function for call to 'swap'
            swap(*__first, *__last);
            ^~~~

如Qt错误报告QTBUG-44944中所述,Qt不提供用于交换数组中两个QJsonValue元素的实现。感谢错误报告者Keith Gardner,我们可以包括我们自己的交换功能。如报告中所建议,您可能希望将其作为内联函数放在全局头文件中。