JSON多层数据添加与访问

本文介绍了一种使用JSON格式存储和管理用户数据的方法,通过创建数据对象,简化后期数据匹配和显示流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近项目中有要用到,JSON的多层数据对象,相当是一个json格式数组里面嵌套一个json对象吧,至于我为什么要用到这个呢,引入业务场景:

  两组数据   1:    user_id    user_hs   user_name

                 2:      user_id    user_location

这两组数据分别从服务器获取     但后期有又必须匹配进行显示:

   故我建立了一个JSON格式数据对象:::

var tempxx ={
                 15112345678: {"hs": "sdfdf","user_name":"scsdcfsd"},
                 15112345678: {"hs": "sdfdf","user_name":"scsdcfsd"}
 };

如何加入新的数据:

tempxx["12345679"] = {"hs": "123","user_name":"scsdcfsd"};

这样,我就可以在后期无须进行匹配,直接根据user_id获取数据了.

console.log(tempxx["12345679"]);

完~~~~~~

转载于:https://www.cnblogs.com/Frank-C/p/4912386.html

<think>我们参考用户提供的引用内容,特别是引用[2]和引用[3]中关于RapidJSON处理嵌套JSON的内容。用户的问题是如何使用RapidJSON库在已有的JSON结构中嵌套添加新的JSON数据。具体步骤:1.解析原始JSON字符串为一个DOM对象(Document)。2.定位到需要添加嵌套数据的位置(可能是已有的一个对象,或者需要新建一个嵌套对象)。3.使用RapidJSON提供的API创建新的嵌套JSON结构(使用Value和Document的API)。4.将新创建的嵌套结构添加到目标位置。5.将修改后的DOM序列化为字符串或写入文件。下面我们通过一个具体示例来展示如何操作。假设我们有一个原始JSON对象:```json{"name":"John","age":30}```我们想在顶层添加一个嵌套对象"contact",其中包含"email"和一个嵌套的"social"对象(包含"twitter")。代码实现步骤:</think>### 使用 RapidJSON 实现嵌套 JSON 数据添加 以下是详细实现步骤(基于 C++ 和 RapidJSON): #### 1. **基础环境准备** ```cpp #include "rapidjson/document.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" using namespace rapidjson; ``` #### 2. **创建嵌套 JSON 结构** ```cpp // 创建根对象 Document doc; doc.SetObject(); Document::AllocatorType& allocator = doc.GetAllocator(); // 添加一级成员 doc.AddMember("name", "John", allocator); // 创建嵌套对象 contact Value contact(kObjectType); contact.AddMember("email", "john@example.com", allocator); // 创建二级嵌套对象 social Value social(kObjectType); social.AddMember("twitter", "@john_twitter", allocator); // 将 social 添加到 contact contact.AddMember("social", social, allocator); // [^2] // 将 contact 添加到根对象 doc.AddMember("contact", contact, allocator); ``` #### 3. **修改已有嵌套结构** ```cpp // 假设已有 JSON 字符串 const char* json = R"({"name":"John","contact":{"email":"john@example.com"}})"; doc.Parse(json); // 获取 contact 对象 Value& contact = doc["contact"]; // 创建新嵌套对象 Value address(kObjectType); address.AddMember("city", "New York", allocator); address.AddMember("zip", "10001", allocator); // 添加到 contact contact.AddMember("address", address, allocator); // [^2] ``` #### 4. **处理多层嵌套数组** ```cpp // 创建三级嵌套结构 Value orders(kArrayType); // 添加订单项(二级嵌套) Value item1(kObjectType); item1.AddMember("product", "Laptop", allocator); item1.AddMember("price", 1200, allocator); orders.PushBack(item1, allocator); // 添加嵌套数组(三级嵌套) Value components(kArrayType); components.PushBack("CPU", allocator); components.PushBack("RAM", allocator); item1.AddMember("components", components, allocator); // [^3] // 添加到根对象 doc.AddMember("orders", orders, allocator); ``` #### 5. **序列化输出结果** ```cpp StringBuffer buffer; Writer<StringBuffer> writer(buffer); doc.Accept(writer); std::cout << buffer.GetString() << std::endl; /* 输出示例: { "name": "John", "contact": { "email": "john@example.com", "social": {"twitter":"@john_twitter"}, "address": {"city":"New York","zip":"10001"} }, "orders": [ { "product": "Laptop", "price": 1200, "components": ["CPU","RAM"] } ] } */ ``` ### 关键注意事项 1. **内存管理** - 所有字符串值需通过 `allocator` 复制 ```cpp Value v; v.SetString("text", allocator); // 正确 // v = "text"; // 错误!会导致悬垂指针 ``` 2. **嵌套路径访问** 使用指针语法访问深层嵌套: ```cpp // 获取 twitter 值 if (doc.HasMember("contact") && doc["contact"].HasMember("social")) { Value& social = doc["contact"]["social"]; std::cout << social["twitter"].GetString(); } ``` 3. **类型安全** - 使用 `GetObject()` 确保对象类型 - 使用 `IsArray()`/`IsObject()` 检查类型[^3] 4. **高效修改** - 直接修改 DOM 树比重新解析更高效 - 使用 `Move()` 语义避免不必要复制: ```cpp Value newValue(kObjectType); doc.AddMember("key", newValue.Move(), allocator); ``` ### 应用场景示例 **向现有 JSON 添加嵌套配置项** ```cpp // 原始 JSON: {"app":{"version":1.2}} doc.Parse(json); // 添加新嵌套结构 Value& app = doc["app"]; Value settings(kObjectType); settings.AddMember("theme", "dark", allocator); settings.AddMember("notifications", true, allocator); app.AddMember("settings", settings, allocator); // [^2] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值