【问题标题】:Deserialize JSON into Object C#将 JSON 反序列化为对象 C#
【发布时间】:2015-12-16 02:11:31
【问题描述】:

您好,我急需一些帮助。我有一个 json 文件,其中包含一组 json 对象。我无法弄清楚如何将其反序列化为该对象的列表。

我的 JSON 在文件中是这种格式 - 它有数千行长,这只是一个示例:

[{
"Rk": 1,
"Gcar": 467,
"Gtm": 1,
"Date": "Apr 6",
"Tm": "CLE",
"Where": "@",
"Opp": "HOU",
"Rslt": "L0-2",
"Inngs": "CG",
"PA": 4,
"AB": 4,
"R": 0,
"H": 0,
"Doubles": 0,
"Triples": 0,
"HR": 0,
"RBI": 0,
"BB": 0,
"IBB": 0,
"SO": 0,
"HBP": 0,
"SH": 0,
"SF": 0,
"ROE": 0,
"GDP": 0,
"SB": 0,
"CS": 0,
"BA": 0,
"OBP": 0,
"SLG": 0,
"OPS": 0,
"BOP": 2,
"aLI": 0.93,
"WPA": -0.093,
"RE24": -0.64,
"DFSDK": 0,
"DFSFD": -1,
"Pos": "Doubles"
},

{
"Rk": 2,
"Gcar": 468,
"Gtm": 2,
"Date": "Apr 8",
"Tm": "CLE",
"Where": "@",
"Opp": "HOU",
"Rslt": "W2-0",
"Inngs": "CG",
"PA": 4,
"AB": 4,
"R": 0,
"H": 2,
"Doubles": 0,
"Triples": 0,
"HR": 0,
"RBI": 0,
"BB": 0,
"IBB": 0,
"SO": 0,
"HBP": 0,
"SH": 0,
"SF": 0,
"ROE": 0,
"GDP": 0,
"SB": 0,
"CS": 0,
"BA": 0.25,
"OBP": 0.25,
"SLG": 0.25,
"OPS": 0.5,
"BOP": 3,
"aLI": 0.71,
"WPA": -0.008,
"RE24": -0.2,
"DFSDK": 6,
"DFSFD": 1.5,
"Pos": "Doubles"
}
]

文件中有 142 个这样的对象。我试图反序列化对象无济于事。此时我已经准备好从头开始,我只是在寻找一些方向来将这些数据转化为可用的对象?

谢谢。

【问题讨论】:

  • 您是否遇到错误,或者具体出了什么问题?
  • 发布您的代码以及您遇到的错误
  • 它说,每当我尝试将其转换为 JObject 时,它都不会将其识别为 json。因此,我开始使用 Json 对象中的所有字段创建一个类,我想知道将数据放入此类列表的最佳方法?
  • 这是一个 JsonArray?您使用的是哪个库?
  • 字符串 jsonString = reader.ReadToEnd(); JArray myObj = (JArray)JsonConvert.DeserializeObject(jsonString);

标签: c# json


【解决方案1】:

您可以使用 Visual Studio 2013、2015 从 json 创建模型类,我做到了,并且很好地解析了 JSON。 要使用此功能,您的剪贴板中必须有 JSON/XML,将光标放在 .cs 文件中,然后使用选项编辑 > 选择性粘贴 > 粘贴 JSON AS 类

查看生成的代码:

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public int Rk { get; set; }
    public int Gcar { get; set; }
    public int Gtm { get; set; }
    public string Date { get; set; }
    public string Tm { get; set; }
    public string Where { get; set; }
    public string Opp { get; set; }
    public string Rslt { get; set; }
    public string Inngs { get; set; }
    public int PA { get; set; }
    public int AB { get; set; }
    public int R { get; set; }
    public int H { get; set; }
    public int Doubles { get; set; }
    public int Triples { get; set; }
    public int HR { get; set; }
    public int RBI { get; set; }
    public int BB { get; set; }
    public int IBB { get; set; }
    public int SO { get; set; }
    public int HBP { get; set; }
    public int SH { get; set; }
    public int SF { get; set; }
    public int ROE { get; set; }
    public int GDP { get; set; }
    public int SB { get; set; }
    public int CS { get; set; }
    public float BA { get; set; }
    public float OBP { get; set; }
    public float SLG { get; set; }
    public float OPS { get; set; }
    public int BOP { get; set; }
    public float aLI { get; set; }
    public float WPA { get; set; }
    public float RE24 { get; set; }
    public int DFSDK { get; set; }
    public float DFSFD { get; set; }
    public string Pos { get; set; }
}

在运行时将 JSON 反序列化为从 Visual Studio 创建的此对象,您可以使用 Newtonsoft.Json,您可以使用以下命令使用 nuget 安装它:

Install-Package Newtonsoft.Json

现在您可以使用静态类 JsconCovert 中的通用方法 DeserializedObject 对其进行反序列化,如下所示:

Rootobject object = JsonConvert.DeserializeObject<Rootobject>(jsonString); 

【讨论】:

  • 伟大的提示!很多很好的答案,但这正在改变生活!
  • 不错的提示。你做了我的一天
  • 太棒了..!!感谢创建 json 到 c# 对象的新方法。真是太棒了。
  • 幸运的是我读到了这篇文章,我通常总是手动创建它们-.---
【解决方案2】:

使用 Newtonsoft.JSON 非常简单,文档中有一个页面涵盖了 how to deserialize an object

取自文档页面:

public class Account
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public IList<string> Roles { get; set; }
}

// code to deserialize from JSON string to a typed object
string json = @"{
    'Email': 'james@example.com',
    'Active': true,
    'CreatedDate': '2013-01-20T00:00:00Z',
    'Roles': [
        'User',
        'Admin'
    ]
";

Account account = JsonConvert.DeserializeObject<Account>(json);

Console.WriteLine(account.Email);
// james@example.com

【讨论】:

    【解决方案3】:

    Newtonsoft 提供了一种方法。

    CustomClass myClassWithCollection = JsonConvert.DeserializeObject<CustomClass>(jsonString);
    

    【讨论】:

      【解决方案4】:

      尝试使用Newtonsoft.Json 库。

      将此https://www.nuget.org/packages/Newtonsoft.Json/7.0.1 添加到您的项目中。

      这是我的解决方案的链接:https://dotnetfiddle.net/eqJXTy

      然后:

      List<Dictionary<string, string>> obj =
          Newtonsoft.Json.JsonConvert.
              DeserializeObject<List<Dictionary<string, string>>>(jsonString);
      
      foreach(Dictionary<string, string> lst in obj)
      {
          Console.WriteLine("--NewObject--");
          Console.WriteLine(string.Format("Rk: {0} Gcar: {1}", lst["Rk"], lst["Gcar"]));
          foreach(KeyValuePair<string, string> item in lst)
          {
              Console.WriteLine(string.Format("Key: {0} Value: {1}", item.Key, item.Value));
          }
      }
      

      很高兴为您提供帮助!

      【讨论】:

        【解决方案5】:
        using(StreamReader reader = new StreamReader(@"path"))
        {
             string jsonString = reader.ReadToEnd();
             JArray myObj = (JArray)JsonConvert.DeserializeObject(jsonString);
        
             var player = new Player();
             player.statsBase = myObj.ToObject<List<StatsBase>>();
        }
        

        这就是我最终完成它的方式。我不确定上述答案是否适用于同一文件中的多个 JSON 对象。

        【讨论】:

        • 试试我的答案,它是一个更好的方法。
        猜你喜欢
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多