c++ - 在 QJsonArray 中搜索项目

标签 c++ json qt stl

我有以下 JsonArray 并想通过其“ID”搜索值。 这里是存储在 QJsonArray 中的 JSON:

{
   "datasources":[
   {"id":1, "name":"tps-pos",       "display-name":"TPS Position"},
   {"id":2, "name":"tps-timer",     "display-name":"TPS Timer"},
   {"id":3, "name":"laterial-g",    "display-name":"Lateral G"},
   {"id":4, "name":"longitudal-g",  "display-name":"Longitudal G"},
   {"id":5, "name":"Z",             "display-name":"Z"},
   {"id":6, "name":"afr",           "display-name":"AFR"},
   {"id":135, "name":"IAT",         "display-name":"Intake Air temperature"},
   {"id":179, "name":"RPM",         "display-name":"RPM"}
]}

我尝试了 std::find ,其中 m_list 包含应在 JSON 中找到的 id。

auto result = std::find(m_DataSourceArray.begin(),m_DataSourceArray.end(), m_list[0]);

调试时,我看到“结果”始终与 m_DataSourceArray + 字段迭代器相同:(调试器 View :)

result  @0x7ed9e0   QJsonArray::iterator
    a   <8 Elemente>    QJsonArray
        [0] <3 Elemente>    QJsonValue (Object)
        [1] <3 Elemente>    QJsonValue (Object)
        [2] <3 Elemente>    QJsonValue (Object)
        [3] <3 Elemente>    QJsonValue (Object)
        [4] <3 Elemente>    QJsonValue (Object)
        [5] <3 Elemente>    QJsonValue (Object)
        [6] <3 Elemente>    QJsonValue (Object)
        [7] <3 Elemente>    QJsonValue (Object)
    i   8   int

最佳答案

我会创建一个新的搜索函数。喜欢:

QJsonObject findValueFromJsonArray(QJsonArray arr, QString key, int val) {
    for (const auto obj : arr) {
        if (obj.toObject().value(key) == val)
            return obj.toObject();
    }
    return QJsonObject();
}

现在我可以通过 id 搜索值。

    QJsonArray m_DataSourceArray = m_DataSourceObject.value(QString("datasources")).toArray();

    QJsonObject obj = findValueFromJsonArray(m_DataSourceArray, "id", 10);
    // Array doesn't contain a value with id 10
    if (obj.isEmpty())
        qDebug() << "Empty QJsonObject";

    QJsonObject obj2 = findValueFromJsonArray(m_DataSourceArray, "id", 2);
    if (!obj2.isEmpty())
        qDebug() << "Not empty!";

    qDebug() << obj2;
    qDebug() << "Display-name of obj2: " << obj2.value("display-name").toString();
    qDebug() << findValueFromJsonArray(m_DataSourceArray, "id", 4);

输出:

Empty QJsonObject
Not empty!
QJsonObject({"display-name":"TPS Timer","id":2,"name":"tps-timer"})
Display-name of obj2:  "TPS Timer"
QJsonObject({"display-name":"Longitudal G","id":4,"name":"longitudal-g"})

当然,如果您不需要在其他地方进行搜索,则不需要创建新函数来进行搜索。

如果您需要按名称或显示名称查找值,您可以创建第二个函数。请注意 val 参数现在是 QString 类型而不是 int。

QJsonObject findValueFromJsonArray(QJsonArray arr, QString key, QString val) {
    for (const auto obj : arr) {
        if (obj.toObject().value(key).toString().contains(val, Qt::CaseSensitivity::CaseInsensitive))
            return obj.toObject();
    }
    return QJsonObject();
}

现在我可以通过值的 ID 或名称搜索值:

    QJsonArray m_DataSourceArray = m_DataSourceObject.value(QString("datasources")).toArray();

    QJsonObject obj = findValueFromJsonArray(m_DataSourceArray, "name", "foo");
    // Array doesn't contain a value with name 'foo'
    if (obj.isEmpty())
        qDebug() << "Empty QJsonObject";

    QJsonObject obj2 = findValueFromJsonArray(m_DataSourceArray, "name", "tps-pos");
    if (!obj2.isEmpty())
        qDebug() << "Not empty!";

    qDebug() << obj2;
    qDebug() << "Display-name of obj2: " << obj2.value("display-name").toString();
    qDebug() << findValueFromJsonArray(m_DataSourceArray, "id", 4);
    qDebug() << findValueFromJsonArray(m_DataSourceArray, "name", "z");
    qDebug() << findValueFromJsonArray(m_DataSourceArray, "display-name", "rpm");

输出:

Empty QJsonObject
Not empty!
QJsonObject({"display-name":"TPS Position","id":1,"name":"tps-pos"})
Display-name of obj2:  "TPS Position"
QJsonObject({"display-name":"Longitudal G","id":4,"name":"longitudal-g"})
QJsonObject({"display-name":"Z","id":5,"name":"Z"})
QJsonObject({"display-name":"RPM","id":179,"name":"RPM"})

关于c++ - 在 QJsonArray 中搜索项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364083/

相关文章:

c++ - 根据文本动态调整控件大小

python - boost::python 如何使用函数成员作为python回调

c++ - Qt 响应子 QWidget 中的 keyPressEvent

c++ - 这有什么问题? C++

c++ - 递归比较字符串的函数 - C++

json - 如何使用对象解构在 TypeScript 中导入 JSON?

javascript - JQUERY JSON响应触发解析错误

java - 使用 TestRestTemplate 和 MockRestServiceServer 时,解析异常而不是实体列表不起作用

c++ - 使用 Qt 和 QSortFilterProxyModel 实现不同的 View

qt - 如何在Qt中发出一定间隔的信号?