我正在尝试反序列化http://api.usa.gov/jobs/search.json?query=nursing+jobs使用.NET 4.0任务模式返回的JSON 。它将返回此JSON(“加载JSON数据” @ http://jsonviewer.stack.hu/)。
http://api.usa.gov/jobs/search.json?query=nursing+jobs
http://jsonviewer.stack.hu/
[ { "id": "usajobs:353400300", "position_title": "Nurse", "organization_name": "Indian Health Service", "rate_interval_code": "PA", "minimum": 42492, "maximum": 61171, "start_date": "2013-10-01", "end_date": "2014-09-30", "locations": [ "Gallup, NM" ], "url": "https://www.usajobs.gov/GetJob/ViewDetails/353400300" }, { "id": "usajobs:359509200", "position_title": "Nurse", "organization_name": "Indian Health Service", "rate_interval_code": "PA", "minimum": 42913, "maximum": 61775, "start_date": "2014-01-16", "end_date": "2014-12-31", "locations": [ "Gallup, NM" ], "url": "https://www.usajobs.gov/GetJob/ViewDetails/359509200" }, ... ]
索引动作:
public class HomeController : Controller { public ActionResult Index() { Jobs model = null; var client = new HttpClient(); var task = client.GetAsync("http://api.usa.gov/jobs/search.json?query=nursing+jobs") .ContinueWith((taskwithresponse) => { var response = taskwithresponse.Result; var jsonTask = response.Content.ReadAsAsync<Jobs>(); jsonTask.Wait(); model = jsonTask.Result; }); task.Wait(); ... }
职位和职位类别:
[JsonArray] public class Jobs { public List<Job> JSON; } public class Job { [JsonProperty("organization_name")] public string Organization { get; set; } [JsonProperty("position_title")] public string Title { get; set; } }
当我设置断点jsonTask.Wait();并检查jsonTask状态为“故障”时。InnerException是“ Type ProjectName.Jobs不是集合”。
jsonTask.Wait();
jsonTask
我从没有JsonArray属性的Jobs类型开始,而Jobs作为数组(Job [])开始出现此错误。
public class Jobs { public Job[] JSON; } + InnerException {"Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'ProjectName.Models.Jobs' because the type requires a JSON object (e.g. {\"name\":\"value\"}) to deserialize correctly.\r\n To fix this error either change the JSON to a JSON object (e.g. {\"name\":\"value\"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.\r\n Path '', line 1, position 1."} System.Exception {Newtonsoft.Json.JsonSerializationException}
如何使用.NET 4.0任务模式处理此站点的JSON?在进入await async.NET 4.5中的模式之前,我想使此工作正常。
await async
答案更新:
这是使用带有brumScouse答案的.NET 4.5异步等待模式的示例。
public async Task<ActionResult>Index() { List<Job> model = null; var client = newHttpClient(); // .NET 4.5 async await pattern var task = await client.GetAsync(http://api.usa.gov/jobs/search.json?query=nursing+jobs); var jsonString = await task.Content.ReadAsStringAsync(); model = JsonConvert.DeserializeObject<List<Job>>(jsonString); returnView(model); }
您将需要引入System.Threading.Tasks名称空间。 注意: 没有.ReadAsString可用的方法,.Content这就是为什么我使用该.ReadAsStringAsync方法。
System.Threading.Tasks
.ReadAsString
.Content
.ReadAsStringAsync
可以使用Json2csharp.com网站之类的东西来代替手动建模。粘贴在示例JSON响应中,越饱满越好,然后提取生成的生成类。至少,这消除了一些活动部分,将使您获得csharp中JSON的形状,从而使序列化程序更轻松,而且您不必添加属性。
使其工作,然后对您的类名进行修改,以符合您的命名约定,并在以后添加属性。
编辑:好了,经过一番混乱,我已经成功地将结果反序列化为作业列表(我使用Json2csharp.com为我创建了类)
public class Job { public string id { get; set; } public string position_title { get; set; } public string organization_name { get; set; } public string rate_interval_code { get; set; } public int minimum { get; set; } public int maximum { get; set; } public string start_date { get; set; } public string end_date { get; set; } public List<string> locations { get; set; } public string url { get; set; } }
然后对您的代码进行编辑:
List<Job> model = null; var client = new HttpClient(); var task = client.GetAsync("http://api.usa.gov/jobs/search.json?query=nursing+jobs") .ContinueWith((taskwithresponse) => { var response = taskwithresponse.Result; var jsonString = response.Content.ReadAsStringAsync(); jsonString.Wait(); model = JsonConvert.DeserializeObject<List<Job>>(jsonString.Result); }); task.Wait();
这意味着您可以摆脱包含的对象。值得注意的是,这不是与任务相关的问题,而是反序列化的问题。
编辑2:
有一种方法可以获取JSON对象并在Visual Studio中生成类。只需复制选择的JSON,然后编辑>选择性粘贴>将JSON粘贴为类。整个页面专门用于此:
http://blog.codeinside.eu/2014/09/08/Visual-Studio-2013-Paste-Special-JSON- And-Xml/