我正在调用一个以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并有两个问题。
我想得到一个与下面相似的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; }
}
我是否需要手动解析此响应,还是有任何简单的方法?
答案 0 :(得分:1)
您可以通过使用指定JSON中使用的名称的JsonProperty
属性修饰C#属性来关联不同名称的JSON和C#属性。
如果您有一个包含动态属性名称的对象,则需要使用Dictionary<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);
答案 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。