爱新觉罗二狗 2024-05-28 15:56 采纳率: 40%
浏览 6

json-cpp中成员名称按输入顺序排而不是字符顺序

c++使用json-cpp的库实现Json字符
写法是:

    Json::Value device;
    Json::Value valueArray;
    Json::Value devProperty;
    device["devType"]="master";
    //        device["property"].append("nodeId");
    devProperty["object"]="node";
    devProperty["property"]["nodeId"]="int";
    valueArray.append("master");
    valueArray.append("relay");
    valueArray.append("slave");
    devProperty["property"]["duty"]=valueArray;
    device["property"]["devList"].append(devProperty);
    //        device["property"].append(valueArray);
    //        valueArray.clear();
    //        valueArray.append("normal");
    //        valueArray.append("offline");
    //        valueArray.append("faulty");
    //        device["property"]["state"]=valueArray;
    //        device["property"].append(valueArray);
    //        device["property"].append(valueArray);
    Json::Value module;
    Json::Value property/*(Json::objectValue)*/;
//    property.setType(Json::objectValue);
//    property.resize(3);
    module["object"]="????";
    //        module["property"].append("paramP");
    //        module["property"].append("paramI");
    //        module["property"].append("paramD");
//    module["property"]["paramP"]="double";
//    module["property"]["paramI"]="double";
//    module["property"]["paramD"]="double";




//    valueArray.clear();
//    valueArray.append("main");
//    valueArray.append("backup");
//    module["property"]["fiberConfig"]=(valueArray);
//    //        module["property"].append("setValue");
//    module["property"]["setValue"]="double";
//    valueArray.clear();
//    valueArray.append(1);
//    valueArray.append(2);
//    valueArray.append(3);
//    module["property"]["clockLevel"]=valueArray;
//    valueArray.clear();
//    valueArray.append("inner");
//    valueArray.append("outer");
//    module["property"]["clockSource"]=(valueArray);
//    module["property"]["hasFreq"]="int";
    property["paramP"]="double";
    property["paramI"]="double";
    property["paramD"]="double";

    valueArray.clear();
    valueArray.append("main");
    valueArray.append("backup");
    property["fiberConfig"]=(valueArray);
    //        module["property"].append("setValue");
    property["setValue"]="double";
    valueArray.clear();
    valueArray.append(1);
    valueArray.append(2);
    valueArray.append(3);
    property["clockLevel"]=valueArray;
    valueArray.clear();
    valueArray.append("inner");
    valueArray.append("outer");
    property["clockSource"]=(valueArray);
    property["hasFreq"]="int";
    module["property"]=property;
    //        module["property"].append("createTime");
    device["property"]["moduleList"].append(module);
    body["devList"].append(device);

最后输出为:

 "devType": "master",
                "property": {
                    "devList": [
                        {
                            "object": "node",
                            "property": {
                                "duty": [
                                    "master",
                                    "relay",
                                    "slave"
                                ],
                                "nodeId": "int"
                            }
                        }
                    ],
             
                    "moduleList": [
                        {
                            "object": "主板",
                            "property": {
                                "clockLevel": [
                                    1,
                                    2,
                                    3
                                ],
                                "clockSource": [
                                    "inner",
                                    "outer"
                                ],
                                "fiberConfig": [
                                    "main",
                                    "backup"
                                ],
                                "hasFreq": "int",
                                "paramD": "double",
                                "paramI": "double",
                                "paramP": "double",
                                "setValue": "double"
                            }
                        }
                    ],
                }
            }

碰到问题是希望json的每个key按照输入顺序排序,而不是字符顺序排序
比如moduleList的property中的paramD、paramI、paramP,输入如下,但是生成的时候顺序是paramP/paramI/paramD

                                "hasFreq": "int",
                                "paramD": "double",
                                "paramI": "double",
                                "paramP": "double",
                                "setValue": "double"

    property["paramP"]="double";
    property["paramI"]="double";
    property["paramD"]="double";

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-28 15:56
    关注

    引自免费微信小程序:皆我百晓生

    在 JSON-CPP 库中,Json::Value 类型的对象(类似于字典或对象)默认不保证键值对的顺序。如果你需要保持插入时的顺序,可以考虑使用 Json::FastWriter 来序列化 JSON 数据,它会尽可能地保留键的插入顺序。

    首先,你需要包含 fastwriter.h 头文件,并且使用 Json::FastWriter 类来创建一个 writer 对象。然后,将你的 JSON 结构写入到字符串中,这样序列化的 JSON 就会尽可能按照你在代码中添加键值对的顺序排列。

    下面是修改后的代码示例:

    #include <json/json.h>
    #include <iostream>
    
    int main() {
        Json::Value device;
        Json::Value valueArray;
        Json::Value devProperty;
        device["devType"] = "master";
        devProperty["object"] = "node";
        devProperty["property"]["nodeId"] = "int";
        valueArray.append("master");
        valueArray.append("relay");
        valueArray.append("slave");
        devProperty["property"]["duty"] = valueArray;
        device["property"]["devList"].append(devProperty);
    
        Json::Value module;
        Json::Value property;
        property["paramP"] = "double";
        property["paramI"] = "double";
        property["paramD"] = "double";
    
        valueArray.clear();
        valueArray.append("main");
        valueArray.append("backup");
        property["fiberConfig"] = valueArray;
        property["setValue"] = "double";
        valueArray.clear();
        valueArray.append(1);
        valueArray.append(2);
        valueArray.append(3);
        property["clockLevel"] = valueArray;
        valueArray.clear();
        valueArray.append("inner");
        valueArray.append("outer");
        property["clockSource"] = valueArray;
        property["hasFreq"] = "int";
    
        module["object"] = "主板";
        module["property"] = property;
    
        device["property"]["moduleList"].append(module);
    
        Json::FastWriter fastWriter;
        std::string jsonString = fastWriter.write(device);
    
        std::cout << jsonString << std::endl;
    
        return 0;
    }
    

    这段代码将输出 JSON 字符串,其中模块属性的顺序应该与你添加它们的顺序一致。注意,这种方法并不能保证在所有情况下都保持顺序,因为 JSON 标准本身并未规定键值对的顺序。然而,对于大部分现代 JSON 解析器而言,使用 Json::FastWriter 序列化的 JSON 应该能保持合理的顺序。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月28日

悬赏问题

  • ¥20 python爬虫遇到空文本取不出来
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入