将字典添加到json文件时,字典中的最后一个条目会覆盖第一个书面条目

时间:2018-08-18 11:26:32

标签: c# arrays dictionary json.net

我有一个看起来像这样的现有json文件:

{ 
 "players": [],
 "games": []
}

我想将对象添加到players数组中,使其看起来像这样:

{ 
 "players": [
  {
   "name": "Peter",
   "checksum": "6fa95b1427af77b3d769ae9cb853382f"
  },
  {
   "name": "John",
   "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
  },
  {
   "name": "Bob",
   "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
  }
 ],
 "games": []
}

播放器存储在全局Dictionary<string, string>中。但是在我的实现中,字典中的下一个元素会覆盖第一个写入的元素,因此当循环在John时,下一个元素将是Bob,然后Peter被{{1 }}。结果如下:

Bob

这是我的代码:

{
  "players": [
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    },
    {
      "name": "John",
      "checksum": "61409aa1fd47d4a5332de23cbf59a36f"
    },
    {
      "name": "Bob",
      "checksum": "2fc1c0beb992cd7096975cfebf9d5c3b"
    }
  ],
  "games": []
}

1 个答案:

答案 0 :(得分:0)

(与此类似的问题已经问了好几次了,但是我找不到重复的,所以我认为值得回答。)

您要创建一个单个 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