gpt4 book ai didi

c++ - 在 QJsonArray 中搜索项目

转载 作者:行者123 更新时间:2023-12-02 03:26:09 24 4
gpt4 key购买 nike

我有以下 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com