c# - 查找 JSON 条目并添加嵌套元素

标签 c# json json.net

我有一个如下所示的 .json 文件:

[
  {
    "username": "John",
    "currency": 8,
    "pulls": 
    [
      {
        "character": "person"
      },
      {
        "character": "loved one"
      }
    ]
  },
  {
    "username": "Mike",
    "currency": 2,
    "pulls": 
    [
      {
        "character": "noone" 
      }
    ]
  },
  {
    "username": "Clara",
    "currency": 5,    
    "pulls": 
    [
      {
        "character": "someone" 
      }
    ]
  }
] 

到目前为止我设法做的是修改“货币”:

    bool userExists = false;
    string jsonPointsString = File.ReadAllText(userPath);
    dynamic jsonObjects = JsonConvert.DeserializeObject(jsonPointsString);
    foreach (var jsonObject in jsonObjects)
    {
        if (jsonObject["username"] == user)
        {
            jsonObject["currency"] += value;
            string output = JsonConvert.SerializeObject(jsonObjects, Formatting.Indented);
            File.WriteAllText(userPath, output);
            userExists = true;
        }
    }

以及从头开始添加一个全新的条目:

    JsonCollection.User user = new JsonCollection.User();
    user.username = username;
    user.currency = 10;
    using (StreamReader r = new StreamReader(userPath))
    {
        string json = r.ReadToEnd();
        List<JsonCollection.User> users = JsonConvert.DeserializeObject<List<JsonCollection.User>>(json);
        users.Add(user);
        newJson = JsonConvert.SerializeObject(users, Formatting.Indented);
    }
    File.WriteAllText(userPath, newJson);

但是,无论我尝试什么,我都无法向“拉动”添加另一个元素。我的想法是,我调用一个函数,其中包含一个用户名和一个 pull,两个字符串。基于 username 变量,我必须找到相应的 Json 条目,并根据 pull 变量在“pulls”树中创建一个新条目。这是我能想到的:

    public void AddPullToUser(string user, string newPull)
    {
        user = "Mike";  //test value

        string jsonPointsString = File.ReadAllText(userPath);
        dynamic jsonObjects = JsonConvert.DeserializeObject(jsonPointsString);
        foreach (var jsonObject in jsonObjects)
        {
            if (jsonObject["username"] == user)
            {
                //jsonObject["pulls"] = newPull;

                JsonCollection.Character pull = new JsonCollection.Character();
                pull.character = newPull;
                jsonObject["pulls"] = pull;

                string output = JsonConvert.SerializeObject(jsonObjects, Formatting.Indented);
                File.WriteAllText(userPath, output);

            }
        }
    }

如果我这样做,系统无法将 JsonCollection 转换为 JArray,但如果不使用 JArray,我不明白如何找到特定的用户树。 在第二步中,这将必须进一步扩展以不创建重复的“拉”,但首先这必须在一般情况下起作用。

如有任何帮助,我们将不胜感激。

最佳答案

像这样的——

var json = "[{'username':'John','currency':8,'pulls':[{'character':'person'},{'character':'loved one'}]},{'username':'Mike','currency':2,'pulls':[{'character':'noone'}]},{'username':'Clara','currency':5,'pulls':[{'character':'someone'}]}]";
var obj = JsonConvert.DeserializeObject<List<RootObject>>(json);
var o = obj.FindIndex(a => a.username == "Mike");
obj[o].pulls.AddRange(new List<Pull>{
        new Pull{
            character = "Modified"
        }
    });

Console.WriteLine(JsonConvert.SerializeObject(obj));

在哪里

public class Pull
{
    public string character { get; set; }
}

public class RootObject
{
    public string username { get; set; }
    public int currency { get; set; }
    public List<Pull> pulls { get; set; }
}

或者,您可能对 JSON Merge 感兴趣

一个可能的解决方案看起来像-

var json = "[{'username':'John','currency':8,'pulls':[{'character':'person'},{'character':'loved one'}]},{'username':'Mike','currency':2,'pulls':[{'character':'noone'}]},{'username':'Clara','currency':5,'pulls':[{'character':'someone'}]}]";
var obj = JArray.Parse(json);
var idx = obj.IndexOf(obj.FirstOrDefault(a => a["username"].ToString() == "Mike"));     
((JArray)obj[idx]["pulls"]).Add(JObject.Parse(@"{
        'character': 'new one'
    }"));
Console.WriteLine(obj[idx]);
/*output - 
 {
   "username": "Mike",
   "currency": 2,
   "pulls": [
     {
        "character": "noone"
     },
     {
        "character": "new one"
     }
  ]
} */

关于c# - 查找 JSON 条目并添加嵌套元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39120322/

相关文章:

c# - 在 Windows 服务和 Windows 应用程序之间使用 EventWaitHandles

C# - 在参数中声明方法(委托(delegate))

c# - 如何在 XAML 中围绕控件的中心进行旋转

javascript - 如何在 highcharts 中加载外部 json 数据以显示条形图

json - 在 JSONObject Swift 中检查键

c# - 为什么 HttpResponseMessage 不显示其内容?

c# - 具有状态/错误代码结果的事件目录身份验证

c# - 期望来自命名空间 'root' 的元素 '' ..遇到名称为 'None' 的 '',命名空间为 ''

json.net - 如何将 Json.NET 中缺失的属性反序列化为默认值?

c# - 强制 JsonConvert.SerializeXmlNode 将节点值序列化为整数或 bool 值