gpt4 book ai didi

c++ - 通过 Qt C++ 中的键访问解析的嵌套 JSON

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:16 24 4
gpt4 key购买 nike

这里是一个 JSON 的例子:

 {
"sets": [
{
"id": "123",
"start": "Alpha",
"end": "Theta",
"units": [
{
"id": " A",
"name": "nameA",
"position": 1,
"capacity": 7
},
{
"id": "nameB",
"name": "WWW4561",
"position": 2,
"capacity": 15
}
]
},
{
"id": "456",
"start": "Beta",
"end": "Zeta",
"units": [
{
"id": "B",
"name": "nameB",
"position": 1,
"capacity": 9
},
{
"id": "F",
"name": "nameF",
"position": 1,
"capacity": 18
}
]
}
]
}

我想将解析后的数据存储在一个容器中,这样我就可以在 startend 的情况下访问 units 中的任何单元项集合的code>值。如果我没记错的话,这应该使用 dictionary 来完成。

目前,我只能遍历 setsunits。这是我尝试过的:

QNetworkReply *json_reply;
QJsonObject jsonObject= QJsonDocument::fromJson(json_reply->readAll()).object();
QJsonArray sets_array = jsonObject["sets"].toArray();
QJsonArray units_array = jsonObject[""].toArray(); // explicitly empty array

int idx = 0;
for (const QJsonValue& set_val: sets_array)
{
QJsonObject set_loopObj = set_val.toObject();

qDebug() << "\nset" << idx;
qDebug() << " id:" << set_loopObj["id"].toString();
qDebug() << "start:" << set_loopObj["start"].toString();
qDebug() << "end:" << set_loopObj["end"].toString();

units_array.append(set_loopObj["units"].toArray());

int idy = 0;
for (const QJsonValue& unit_val: units_array)
{
QJsonObject unit_loopObj = unit_val.toObject();

qDebug() << "\nunit";
qDebug() << "id:" << unit_loopObj["id"].toString();
qDebug() << "name:" << unit_loopObj["name"].toString();
qDebug() << "position:" << unit_loopObj["position"].toDouble();
qDebug() << "capacity:" << unit_loopObj["capacity"].toDouble();

++idy;
}
++idx;
}
qDebug() << "\nsets_array" << sets_array;
qDebug() << "\nunits_array" << units_array;

更新

例如,我希望通过给出 "Alpha","Theta" 来获得第一个集合的两个单元作为一个数组,这样我应该能够通过给出一个索引来访问各个单元(例如,第 2 个单元为 1 个)。

在提供 "Alpha, Theta" 键时,我还想获取其余的集合信息 (id)。

由于我是新手,请在您的答案中提供代码。

最佳答案

我肯定会把它分成两个任务。第一个子任务是根据开始和结束实际抓取适当的对象。

QJsonObject find_by_start_and_end(const QJsonObject& obj, 
const QString& start,
const QString& end) {

QJsonArray sets_array = jsonObject["sets"].toArray();


// For every object in the array, check if its start and end are the target.
// If so return it.

for(const auto& set_obj: sets_array) {
QJsonObject set = set_obj.toObject();
if(set["start"].toString() == start && set["end"].toString() == end) {
return set;
}
}

// If there are no matches, return an empty object.
return QJsonObject{};
}

现在您可以按(开始、结束)元组进行搜索——感觉真好。通过抓取整个对象,您可以获得有关它的所有信息:开始、结束、ID 和所有单位。

现在您只需要创建一个函数,使用这个助手来适本地索引到单位数组。

QJsonObject get_kth_unit_by_start_and_end(const QJsonObject& obj, 
const QString& start,
const QString& end,
const std::size_t k) {
// get the target by start and end tuple
const QJsonObject target_obj = find_by_start_and_end(obj, start, end);

// If the target is empty, the `units` array will not exist.
if(target_obj.empty())
return target_obj;

// get the units array from that returned target
QJsonArray units = target_obj["units"].toArray();

if(units.size() <= k) {
throw std::runtime_exception("Invalid k.");
}

// return the kth unit object.
return units[k].toObject();
}

我还没有测试过这个;但是,这应该会给您一个良好的开端。

关于c++ - 通过 Qt C++ 中的键访问解析的嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893578/

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