C# 将字典添加到json文件时,字典中的最后一个条目将覆盖第一个写入的条目

C# 将字典添加到json文件时,字典中的最后一个条目将覆盖第一个写入的条目,c#,arrays,dictionary,json.net,C#,Arrays,Dictionary,Json.net,我有一个现有的json文件,如下所示: { "players": [], "games": [] } { "players": [ { "name": "Peter", "checksum": "6fa95b1427af77b3d769ae9cb853382f" }, { "name": "John", "checksum": "61409aa1fd47d4a5332de23cbf59a36f" }, { "name": "Bob",

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

{ 
 "players": [],
 "games": []
}
{ 
 "players": [
  {
   "name": "Peter",
   "checksum": "6fa95b1427af77b3d769ae9cb853382f"
  },
  {
   "name": "John",
   "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
  },
  {
   "name": "Bob",
   "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
  }
 ],
 "games": []
}
{
  "players": [
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    },
    {
      "name": "John",
      "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
    },
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    }
  ],
  "games": []
}
我想将对象添加到
players
数组中,使其看起来像这样:

{ 
 "players": [],
 "games": []
}
{ 
 "players": [
  {
   "name": "Peter",
   "checksum": "6fa95b1427af77b3d769ae9cb853382f"
  },
  {
   "name": "John",
   "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
  },
  {
   "name": "Bob",
   "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
  }
 ],
 "games": []
}
{
  "players": [
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    },
    {
      "name": "John",
      "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
    },
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    }
  ],
  "games": []
}
播放器存储在全局
词典中。但在我的实现中,字典中的下一个元素覆盖了第一个编写的元素,因此当循环位于
John
时,下一个元素将是
Bob
,然后
Peter
Bob
替换。其结果如下所示:

{ 
 "players": [],
 "games": []
}
{ 
 "players": [
  {
   "name": "Peter",
   "checksum": "6fa95b1427af77b3d769ae9cb853382f"
  },
  {
   "name": "John",
   "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
  },
  {
   "name": "Bob",
   "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
  }
 ],
 "games": []
}
{
  "players": [
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    },
    {
      "name": "John",
      "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
    },
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    }
  ],
  "games": []
}
这是我的代码:

string json = File.ReadAllText("file.json");
JObject jsonObject = JObject.Parse(json);
JArray jsonPlayerArray = (JArray) jsonObject["players"];

JObject newPlayerEntry = new JObject();
var sortedDict = PlayerChecksumDict.OrderBy(x => x.Key);
foreach (var item in sortedDict)
{
    newPlayerEntry["name"] = item.Key;
    newPlayerEntry["checksum"] = item.Value;
    jsonPlayerArray.Add(newPlayerEntry);
}
string modifiedJson = jsonObject.ToString(Formatting.Indented);
File.WriteAllText("file-modified.json", modifiedJson);
(类似的问题已经被问了好几次,但我还没有找到一个重复的,所以我觉得值得回答。)

您正在创建一个
JObject
实例,然后在循环中多次修改它。每次迭代将覆盖上一次迭代中的数据集。您的
JArray
最终会大量引用同一
JObject

相反,您需要为字典中的每个条目创建一个新的
JObject
。为此,只需将
newPlayerEntry
的声明移动到循环中:

var sortedDict = PlayerChecksumDict.OrderBy(x => x.Key);
foreach (var item in sortedDict)
{
    JObject newPlayerEntry = new JObject();
    newPlayerEntry["name"] = item.Key;
    newPlayerEntry["checksum"] = item.Value;
    jsonPlayerArray.Add(newPlayerEntry);
}

现在,
JArray
中的每个元素都将引用不同的
JObject

您只创建一个用于所有条目的
JObject
。相反,移动JObject newplayertry=newjobject()进入你的循环,而不是让它在外面。)(这肯定是许多问题的重复-我会尝试找到一个,但同时这应该会帮助你。)这是我发现的最接近的问题-实际上是相同的,但只有当你知道答案时:我没有投票以重复的方式结束这个问题,但是其他人可能会这样做。谢谢,我不知道
JArray
对同一
JObject
有多个引用。尽管这很明显。