无法在c#中反序列化JSON

时间:2017-09-29 08:02:25

标签: c# json rest api json-deserialization

我从REST API获得了以下JSON。

{
   "data":{
      "id":123,
      "zoneid":"mydomain.com",
      "parent_id":null,
      "name":"jaz",
      "content":"172.1 6.15.235",
      "ttl":60,
      "priority":null,
      "type":"A",
      "regions":[
         "global"
      ],
      "system_record":false,
      "created_at":"2017-09-28T12:12:17Z",
      "updated_at":"2017-09-28T12:12:17Z"
   }
}

并尝试使用以下代码解析,但这不会导致正确的反序列化类型。

var model = JsonConvert.DeserializeObject<ResponseModel>(response);           

下面是根据我在JSON响应中收到的字段的类。

 public class ResponseModel
{
    public int id { get; set; }
    public string zone_id { get; set; }
    public int parent_id { get; set; }
    public string name { get; set; }
    public string content { get; set; }
    public int ttl { get; set; }
    public int priority { get; set; }
    public string type { get; set; }
    public string[] regions { get; set; }
    public bool system_record { get; set; }
    public DateTime created_at { get; set; }
    public DateTime updated_at { get; set; }

}

缺少什么?

4 个答案:

答案 0 :(得分:2)

你错过了一个包装类。

public class Wrapper 
{
   public ResponseModel data {get;set}
}

然后执行:

var model = JsonConvert.DeserializeObject<Wrapper>(response).data; 

将ResponseModel的实例从data属性中获取。

你可以从你的json中扣除这个:

{ "data": 
   { "id":123, /*rest omitted */ }
}

将接收此JSON的类型需要具有名为data的属性。建议的Wrapper类充当该类型。

答案 1 :(得分:2)

根据json2csharp网站,您的模型似乎不正确。试试这个:

public class ResponseModel
{
    public int id { get; set; }
    public string zoneid { get; set; }
    public object parent_id { get; set; }
    public string name { get; set; }
    public string content { get; set; }
    public int ttl { get; set; }
    public object priority { get; set; }
    public string type { get; set; }
    public List<string> regions { get; set; }
    public bool system_record { get; set; }
    public DateTime created_at { get; set; }
    public DateTime updated_at { get; set; }
}

public class RootObject
{
    public ResponseModel data { get; set; }
}

答案 2 :(得分:1)

您的模型与您的回复不符 - 它与data属性匹配。只需将另一个对象包裹起来

public class ResponseData
{
    public ResponseModel Data {get; set; {
}

然后

var model = JsonConvert.DeserializeObject<ResponseData>(response); 

答案 3 :(得分:1)

这是一个很酷的技巧,你可以在Visual Studio 2015-2017中做,如果你只是复制JSON(ctrl + c),它会生成正确的类。

您需要在visual studio中创建一个新类,并在课堂内进入编辑菜单 - &gt;粘贴特殊 - &gt;将JSON粘贴为类。

Steps to generate json class

这将为您生成该json的C#对象并为您节省所有麻烦:)