如何用nlohmann库编写指定嵌套JSON?现有代码问题求助
动态生成指定格式JSON的实现问题
我需要读取不同输入生成指定格式的JSON输出,其中FeatureDetails条目会随输入动态增加。查了很多论坛,大多是JSON解析的内容,找不到编写的指导,现在写的代码出不来预期结果,求指导怎么实现目标输出。
预期输出格式
{ "LayerData": [ { "FeatureName": "Network", "GeometryType": "Line", "FeatureDetails": [ { "FeatureID": 7, "Area": 0.0, "FromDat": [ "Network:7", "Network:244", "Points:709" ], "EndPoint": "638493.493137151,4561653.29740454", "ToDat": [ "Network:7", "ticks:125", "ticks:126" ] }, { "FeatureID": 83, "Area": 0.0, "FromDat": [ "Network:83", "Network:84", "Points:369" ], "EndPoint": "638430.41,4562051.04", "ToDat": [ "Network:83", "Network:319", "Points:364" ] }, { "FeatureID": 84, "Area": 0.0, "FromDat": [ "Network:84", "Network:318", "ticks:34", "CPoint:38", "Points:365" ], "EndPoint": "638468.91,4562021.03", "ToDat": [ "Network:83", "Network:84", "Points:369" ] } ] } ] }
现有尝试代码
std::ofstream jsonOut(jsonOutputPath); js["LayerData"]["GeometryType"] = "Line"; js["LayerData"]["FeatureName"] = strLayerName; while (Cursor->NextFeature(&feature) == S_OK) { js["LayerData"]["FeatureDetails"]["FeatureID"] = ID; js["LayerData"]["FeatureDetails"]["Area"] = area; js["LayerData"]["FeatureDetails"]["FromDat"] = fromArr; js["LayerData"]["FeatureDetails"]["ToDat"] = toArr; jsonOut << std::setw(4) << js; }
问题分析与修正代码
现有代码存在几个关键问题:
LayerData是数组类型,却被当成普通对象赋值,不符合预期结构FeatureDetails同样是数组类型,每次循环直接覆盖同一个对象,无法生成多条条目- 循环内重复输出整个JSON,会导致文件内容重复错乱
假设你使用的是nlohmann/json这类常用C++ JSON库,修正后的代码如下:
#include <nlohmann/json.hpp> using json = nlohmann::json; // ... std::ofstream jsonOut(jsonOutputPath); json js; // 构建LayerData数组中的单个对象(示例中LayerData仅包含一个对象) json layerObj; layerObj["FeatureName"] = strLayerName; layerObj["GeometryType"] = "Line"; // 初始化FeatureDetails数组 json featureDetailsArr = json::array(); while (Cursor->NextFeature(&feature) == S_OK) { // 构建单个FeatureDetails对象 json featureDetail; featureDetail["FeatureID"] = ID; featureDetail["Area"] = area; featureDetail["FromDat"] = fromArr; // 假设fromArr为json数组类型 featureDetail["ToDat"] = toArr; // 假设toArr为json数组类型 featureDetail["EndPoint"] = endPoint; // 补充示例中存在但原代码遗漏的字段 // 将单个对象加入FeatureDetails数组 featureDetailsArr.push_back(featureDetail); } // 关联FeatureDetails数组与层对象 layerObj["FeatureDetails"] = featureDetailsArr; // 将层对象加入LayerData数组 js["LayerData"].push_back(layerObj); // 一次性输出完整JSON到文件 jsonOut << std::setw(4) << js; jsonOut.close();
关键修正点
- 明确JSON层级结构:
LayerData是数组,内部包含一个对象;该对象的FeatureDetails也是数组 - 循环内创建独立的
FeatureDetails对象,逐个加入数组,避免数据覆盖 - 最后一次性输出完整JSON结构,而非循环内重复输出
- 补充了示例中存在但原代码遗漏的
EndPoint字段
内容的提问来源于stack exchange,提问作者user24443
相关产品推荐
相关产品推荐

