2

我正在调用一个以 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# 类中的 LastModified 属性。
  2. 其次也是最重要的,作业数组包含一个带有 id 的动态属性。如何将动态值(例如 1319244)转换为嵌套对象中的 ID 属性。

我想得到一个类似于下面的 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; }
    }

我需要手动解析这个响应还是有什么简单的方法?

4

2 回答 2

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

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

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

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);
于 2013-08-27T13:49:45.890 回答
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。

于 2013-08-28T05:17:01.653 回答