C# 将字典添加到json文件时,字典中的最后一个条目将覆盖第一个写入的条目
我有一个现有的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",
{
"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
有多个引用。尽管这很明显。