You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:58:29