如何解析JSON?

时间:2013-08-27 09:27:04

标签: json c#-4.0 json.net

我正在调用一个以JSON格式返回响应的api,我无法控制它的响应。

它产生的响应类似于以下

{
   "success": "Yes",
   "resource": "Job/record",
   "count": 2,
   "last-modified": "2013-06-20 10:21:53",
   "Job": {
      "1297585": {
         "link": {},
         "last-modified": "2013-06-20 10:21:53",
         "id": "1297585"
      },
      "1319244": {
         "link": {},
         "last-modified": "2013-06-20 10:21:53",
         "id": "1319244"
      }
   }
}

我正在使用HttpWebRequest和HttpWebResponse来获取此JSON。我需要将它反序列化为POCO并有两个问题。

  1. 响应包含最后修改的属性如何转换它 到C#class的LastModified属性。
  2. 其次,最重要的是,job数组包含一个带id的动态属性。如何将动态值(如1319244)转换为嵌套对象中的ID属性。
  3. 我想得到一个与下面相似的poco。

    public class Response
        {
            public String Success { get; set; }
            public String Resource { get; set; }
            public Int32 Count { get; set; }
            public DateTime LastModified { get; set; }
            public Job[] Jobs { get; set; }
        }
    
        public class Job
        {
            public Int32 ID { get; set; }
            public String Link { get; set; }
            public String LastModified { get; set; }
        }
    

    我是否需要手动解析此响应,还是有任何简单的方法?

2 个答案:

答案 0 :(得分:1)

  1. 您可以通过使用指定JSON中使用的名称的JsonProperty属性修饰C#属性来关联不同名称的JSON和C#属性。

  2. 如果您有一个包含动态属性名称的对象,则需要使用Dictionary<string,X>来接收反序列化的值,其中X是object或您定义的类(我会尽可能推荐后者。

  3. 考虑到这些要点,您可以像这样定义您的类:

    public class Response
    {
        [JsonProperty(PropertyName = "success")]
        public String Success { get; set; }
    
        [JsonProperty(PropertyName = "resource")]
        public String Resource { get; set; }
    
        [JsonProperty(PropertyName = "count")]
        public Int32 Count { get; set; }
    
        [JsonProperty(PropertyName="last-modified")]
        public DateTime LastModified { get; set; }
    
        [JsonProperty(PropertyName = "Job")]
        public Dictionary<string, Job> Jobs { get; set; }
    }
    
    public class Job
    {
        [JsonProperty(PropertyName = "id")]
        public Int32 ID { get; set; }
    
        [JsonProperty(PropertyName = "link")]
        public object Link { get; set; }
    
        [JsonProperty(PropertyName = "last-modified")]
        public String LastModified { get; set; }
    }
    

    你可以像这样反序列化它们:

    Response responseObj = JsonConvert.DeserializeObject<Response>(jsonString);
    

答案 1 :(得分:0)

我最终使用Json.Net并手动反序列化Json。原来这不是什么大不了的事。

这是代码

var jo = JObject.Parse(json);
        var data = (JObject)jo["Job"];
        foreach (var item in data)
        {
            JToken token = JToken.Parse(item.Value.ToString());

            Console.WriteLine(token.Value<String>("id"));
        }

我所要做的就是读取作业对象,然后使用循环迭代它。在循环内部,我可以读取任何属性并将其分配给我的POCO。