如何向JSON文件的stop_points数组添加字典数据?操作遇阻求助
我懂你现在的困扰——想用JSONLibrary的Add Object To JSON方法把新的字典对象塞进JSON里的stop_points数组,但试了半天没成功。其实问题出在方法的使用场景上,咱们换个思路就能搞定:
为什么原来的方法没用?
Add Object To JSON默认是给JSON的顶层结构添加新的键值对,而不是往指定的数组里追加元素。你要操作的是嵌套在根对象里的stop_points数组,得先定位到这个数组再动手。
正确的操作步骤
假设你用的是UiPath的JSONLibrary(或者类似的.NET JSON操作库),按下面的步骤来:
先把JSON文件加载成可操作的对象
用Read JSON File方法读取你的原JSON文件,得到一个JSON对象(比如命名为rootJson),这样才能对里面的内容进行修改。定位到stop_points数组
用Get Value方法从rootJson里取出stop_points字段,这个字段是一个数组类型,把它存到变量stopPointsArray里。准备好要添加的新字典对象
把你提供的那个完整字典对象整理好,注意里面的sort字段——原数组里已经有sort=1和sort=2的元素,建议把新对象的sort改成3,避免排序混乱。把新对象添加到数组里
调用Add Item To Array方法,把准备好的新字典对象添加到stopPointsArray中。把更新后的数组写回原JSON对象,再保存文件
用Set Value方法把修改后的stopPointsArray放回rootJson的stop_points字段,最后用Write JSON File把更新后的rootJson保存回原文件。
用代码示例更直观(C#风格)
如果是用Newtonsoft.Json(很多JSONLibrary底层都是用它),可以这么写:
// 读取原JSON文件 JObject rootJson = JObject.Parse(File.ReadAllText("你的JSON文件路径.json")); // 获取stop_points数组 JArray stopPoints = (JArray)rootJson["stop_points"]; // 构造要添加的新站点对象 JObject newStopPoint = JObject.Parse(@" { ""fullname"":""Nguyễn Lê Minh"", ""phone"":""0932228888"", ""address"":""146 Pasteur, Bến Nghé, Quận 1, Hồ Chí Minh, Việt Nam"", ""region_id"":1442, ""district"":""Quận 1"", ""province"":""Hồ Chí Minh"", ""location"":[ 10.775334, 106.70081000000005 ], ""sort"":3, // 这里改成3,避免和已有元素的sort重复 ""pick_items"":{ ""number_of_items"":0, ""weight"":0, ""cubic_volume"":[ 0, 0, 0 ], ""items"":[ ] }, ""drop_items"":{ ""number_of_items"":0, ""weight"":0, ""cubic_volume"":[ 0, 0, 0 ], ""items"":[ ] }, ""pick_papers"":[ { ""code"":"""", ""name"":"""", ""description"":"""", ""type"":"""" } ], ""drop_papers"":[ { ""code"":"""", ""name"":"""", ""description"":"""", ""type"":"""" } ], ""note"":""this is note 2"", ""paper"":""CTDK03"", ""cod"":0, ""address_detail"":""146/55 Pasteur"" }"); // 添加到数组 stopPoints.Add(newStopPoint); // 保存回文件,带缩进格式更易读 File.WriteAllText("你的JSON文件路径.json", rootJson.ToString(Formatting.Indented));
最后验证
保存完成后打开你的JSON文件,检查stop_points数组里是不是已经多了这个新对象,同时确认sort字段的数值合理,这样就大功告成啦!
内容的提问来源于stack exchange,提问作者Cường Nguyễn

