【问题标题】:deserializing the json string to object in c# (Newtonsoft.Json)将json字符串反序列化为c#中的对象(Newtonsoft.Json)
【发布时间】:2016-05-12 11:20:41
【问题描述】:

我想将json字符串反序列化为c#对象,格式如下

[{
"data": "{\"SecureId\":null,\"FNAME\":\"WILL\",\"MNAME\":null,\"LNAME\":\"CLINTON\",\"POSTNAME\":\"Mrs.\",\"DOB\":\"6/10/1997\",\"GENDER\":\"M\",\"ORGID\":null}",
"isAvial": true,
"details": "55",
"id": "1999089"}, {
"data": "{\"SecureId\":null,\"FNAME\":\"RIN\",\"MNAME\":null,\"LNAME\":\"MANN\",\"POSTNAME\":\"Jr\",\"DOB\":\"9/16/1997\",\"GENDER\":\"F\",\"ORGID\":null}",
"isAvial": true,
"details": "P2145",
"id": "1999090"}, {
"data": "{\"SecureId\":null,\"FNAME\":\"RIN\",\"MNAME\":null,\"LNAME\":\"MANNING\",\"POSTNAME\":\"M.D.\",\"DOB\":\"9/16/1997\",\"GENDER\":\"F\",\"ORGID\":null}",
"isAvial": true,
"details": "205",
"id": "1999091"}, {
"data": "{\"SecureId\":null,\"FNAME\":\"David\",\"MNAME\":null,\"LNAME\":\"O'PETER\",\"POSTNAME\":\"Dr\",\"DOB\":\"9/6/1997\",\"GENDER\":\"M\",\"ORGID\":null}",
"isAvial": true,
"details": "PM25",
"id": "1999092"}]

我尝试了以下方法,但没有成功。我正在使用 Newtonsoft.json

public class DataObj
{
    public string isAvial { get; set; }
    public string details { get; set; }
    public string id { get; set; }
    public DataTable data { get; set; }
}
public class JsonOutput
{
    public List<DataObj> DetailsObj { get; set; }
}

var desc = JsonConvert.DeserializeObject<List<JsonOutput>>(jsonstring);

感谢您的帮助..

【问题讨论】:

  • 我想你只需要:JsonConvert.DeserializeObject&lt;List&lt;DataObj&gt;&gt;(jsonstring);
  • 上述方法“JsonConvert.DeserializeObject>(jsonstring)”是有效的,但前提是我将“DataObj”类中的属性数据更改为字符串类型。谢谢...
  • 问题可能是DataTable没有无参数的构造函数......

标签: c# json json.net json-deserialization


【解决方案1】:

它失败了,因为您的 JSON 是一个数组,但您试图反序列化为包含数组的对象,而不是直接反序列化为数组或列表。此外,我严重怀疑您的属性 data 是否可以按原样反序列化,您可能必须编写自定义代码来反序列化 DataTable,或者您应该使用自定义类型将其更改为通用列表/集合。

public class DataObj
{
    public string isAvial { get; set; }
    public string details { get; set; }
    public string id { get; set; }
    // public DataTable data { get; set; } // if this is the FCL defined DataTable you will not be able to deserialize it without some custom code. Better would be to have a strongly typed custom class 
}

var desc = JsonConvert.DeserializeObject<List<DataObj>>(jsonstring);

【讨论】:

  • 是的,这个“数据”属性实际上导致不反序列化为数据表。但如果我将类型更改为字符串,它会反序列化为字符串谢谢..
【解决方案2】:

如果“数据”中的格式正确。那么这就解决了

public class DataObj
{
    public string isAvial { get; set; }
    public string details { get; set; }
    public string id { get; set; }
    public DataTable data { get; set; } 
} 
var desc = JsonConvert.DeserializeObject<List<DataObj>>(jsonstring);

else 单独解析 Datatable 或类似的东西 (DataTable)JsonConvert.DeserializeObject(JsonString, (typeof(DataTable)));

【讨论】:

  • 或尝试将 DeserializeObject "data" 作为字符串。然后尝试将字符串解析为数据表。!!
【解决方案3】:

在您的 JSON 对象中,您有一个 DataObj 对象列表,因此(前提是根据 JSON 结构正确描述了 DataTable 类)您应该使用以下内容进行反序列化:

var desc = JsonConvert.DeserializeObject<List<DataObj>>(jsonstring);

【讨论】:

    【解决方案4】:

    试试

    public class dataC
    {
        public int SecureId { get; set; }
        public string FNAME { get; set; }
        public string  MNAME { get; set; }
        public string LNAME { get; set; }
        public string POSTNAME { get; set; }
        public string DOB { get; set; }
        public string GENDER { get; set; }
        public int ORGID { get; set; }
    }
    
    
    public class DataObj
        {
            public dataC data { get; set; }
            public bool isAvial { get; set; }
            public string details { get; set; }
            public string id { get; set; }
        }
    
    
    JsonConvert.DeserializeObject<List<DataObj>>(jsonstring);
    

    【讨论】:

      【解决方案5】:

      你的反序列化类应该是这样的

       public class RootObject
          {
              private object _data;
      
              public object data
              {
                  get
                  {
                      return _data;
                  }
                  set
                  {
                      _data = JsonConvert.DeserializeObject<dataS>(value.ToString());
                  }
              }
      
              public bool isAvial { get; set; }
              public string details { get; set; }
              public string id { get; set; }
          }
      
          public class dataS
          {
              public object SecureId { get; set; }
              public string FNAME { get; set; }
              public object MNAME { get; set; }
              public string LNAME { get; set; }
              public string POSTNAME { get; set; }
              public string DOB { get; set; }
              public string GENDER { get; set; }
              public object ORGID { get; set; }
          }
      

      而且序列化应该是这样的

      var tmp = JsonConvert.DeserializeObject<List<RootObject>>(json);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-21
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多