json.net,将新对象/项添加/附加到现有JSON对象中

时间:2016-08-12 02:14:49

标签: c# json json.net

我有一个如下的json数据,我想在" revs"中添加新条目。数组如果Item_id匹配,那么说我看的Item_id是1,现有的json数据包含两个项目" revs"数组,并希望添加新条目

{
   "Root" : [
        {
             "Item_Name" : "Test",
             "Items" : [
                {
                    "Item_id" : "1",
                    "revs" : [
                        {
                            "rev_id" : "1"
                        },
                        {
                            "rev_id" : "3"
                        },
                        {
                            "rev_id" : "need to add new entry here"
                        }
                    ]
                },
                {
                    "Item_id" : "2",
                    "revs" : [
                        {
                            "rev_id" : "1"
                        }
                    ]   
                }
            ]
        }
    ]
}

我像这样解析json数据

JObject jsonObject = JObject.Parse(<the json data above>);

迭代进入&#34; revs&#34;在Item_id匹配之后的数组,我创建了一个辅助新条目数据的JObject

JObject new_rev = new JObject();
new_rev["rev_id"] = "need to add new entry here"

如何使我的new_rev数据反映在jsonObject中?

p / s:我之前使用jsoncpp for C ++,我只是通过引用对象循环,我可以轻松地将json数据修改成它

感谢。

2 个答案:

答案 0 :(得分:2)

假设Root数组中只有一个项目,并假设Item_id将是唯一的

    JObject jsonObject = JObject.Parse(<the json string>);
    JObject new_rev = new JObject();
    new_rev["rev_id"] = "need to add new entry here";
    JArray items = jsonObject["Root"][0]["Items"].Value<JArray>();
    foreach(var item in items){
        if(item.Value<JObject>()["Item_id"].Value<string>() == "1"){
            item["revs"].Value<JArray>().Add(new_rev);
            break;
        }
    }

在此处查看documentation

答案 1 :(得分:1)

我试着找出更好的方法来添加数据,最后实现LINQ(方法语法)让我的生活更轻松,下面的代码对我有用,eventhough包含多个Root,Items

对不起,我还是LINQ的新手,也许有人可以用同样的查询语法来启发我

JObject jsonObject = JObject.Parse(<existing json data>);
JObject newNode = new JObject();
newNode["rev_id"] = "need to add new entry here"

jsonObject["Root"].Children()
                       .Where(w => w["Item_Name"].ToString() == selectedItemName)
                       .Select(s => s["Items"]).Children()
                       .Where(w => w["Item_id"].ToString() == selectedItemId)
                       .Select(s => s["revs"]).Children()
                       .LastOrDefault().AddAfterSelf(newNode);