将C# JSON文件转换为列表

9

在我的 C# + WPF + .NET 4.5 代码中,假设我如下所示定义了一个 Player 类:

public class Player {
  public string FirstName;
  public string LastName;
  public List<int> Cells;
  public string Level;
}

我有一个myobjects.json文件,我使用JSON.NET编写了这些对象的序列化集合(以下显示前两个):

{
  "FirstName": "Foo",
  "LastName": "Fighter",
  "Cells": [
    1,
    2,
    3
  ],
  "Level": "46"
}{
  "FirstName": "Bar",
  "LastName": "Baz",
  "Cells": [
    104,
    127,
  ],
  "Level": "D2"
}

我希望做的是读取文件,反序列化这些对象并填充一个List类型的Player列表:
using (Stream fs = openDialog.OpenFile())
using (StreamReader sr = new StreamReader(fs))
using (JsonTextReader jr = new JsonTextReader(sr)) {
  while (jr.Read()) {
    /* Find player in file */
    Player p = /* Deserialize */
    PlayerList.Add(p);
  }
}
2个回答

34

不需要逐项阅读。

string json = File.ReadAllText("myobjects.json");
var playerList = JsonConvert.DeserializeObject<List<Player>>(json);
你可以使用这段代码将你的玩家列表写入文件。
File.WriteAllText("myobjects.json", JsonConvert.SerializeObject(playerList));

1
无法将当前的JSON对象(例如{"name":"value"})反序列化为类型'System.Collections.Generic.List`1[MyApp.Player]',因为该类型需要一个JSON数组(例如[1,2,3])才能正确反序列化。要解决此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为可以从JSON对象反序列化的普通.NET类型(例如不是像整数这样的基元类型,也不是像数组或List<T>这样的集合类型)。还可以向类型添加JsonObjectAttribute以强制它从JSON对象反序列化。 - mbaytas
@baytas 首先,使用序列化代码 File.WriteAllText... 并将结果与您的进行比较。很可能您没有形成正确的 JSON 数组。(例如,您问题中的 JSON 在对象之间缺少逗号。) - I4V
2
仅为完成而言:对象必须用 [ ] 括起来,以便形成数组,并且对象之间必须用逗号分隔 [{"firstName":"value1"},{"firstName":"value1"}]。 - CodeHacker

3
在 C# .Net Core 控制台应用程序中: 首先,通过以下命令从 NuGet 安装 Newtonsoft。

PM> Install-Package Newtonsoft.Json -Version 12.0.2

    string filePath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\..\")) + @"Data\Country.json";
    string _countryJson = File.ReadAllText(filePath);
    var _country = JsonConvert.DeserializeObject<List<Country>>(_countryJson);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接