当前位置: 首页 > 面试题库 >

使用.NET 4.0任务模式使用HTTPClient .ReadAsAsync将JSON反序列化为数组或列表

巫马炫明
2023-03-14
问题内容

我正在尝试反序列化http://api.usa.gov/jobs/search.json?query=nursing+jobs使用.NET
4.0任务模式返回的JSON 。它将返回此JSON(“加载JSON数据” @ 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不是集合”。

我从没有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中的模式之前,我想使此工作正常。

答案更新:

这是使用带有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方法。


问题答案:

可以使用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/



 类似资料:
  • 问题内容: 我在反序列化以下json数组时遇到麻烦(对不起,大小): 如果将其粘贴到json-viewer中,则会得到以下结构: 现在,包含具有坐标的数组的数组具有可变大小。所以我想在Java中,整个对象应该是一个数组,其中包含数组的集合,每个数组都包含一个。就像是 但是gson不接受这一点。我收到以下错误消息: 这似乎很奇怪,因为对我来说好像不像一个数组。但这可能使我感到困惑,或多或少地迷路了…

  • 我收到来自第3方服务提供商的JSON响应,其中包含一系列对象。当我尝试使用Jackson api反序列化JSON时。我收到以下异常 我的回答是 我的POJO课是这样的 我正在尝试使用以下代码反序列化JSON 如果我试着去做 它在BEGIN_对象本身失败。 如何使用数组读取和反序列化JSON。我应该编写自己的反序列化器吗? 编辑如果我使用JSON字符串而不是流,那么我就能够取回所有Java对象。但为

  • 问题内容: 我有一个带有JSON数组的有效JSON对象。JSON数组没有花括号,并且包含逗号分隔的混合类型列表。看起来像这样: 我创建了一个反映JSON结构的类,为复杂数组提供了一个List: 我也用列表列表进行了测试: 子模型如下所示: 在我的program.cs文件中,我正在反序列化如下: 当我运行该程序时,子对象(Rows)始终为。我究竟做错了什么? 问题答案: Json.Net没有将数组自

  • 我在使用spring反序列化json数组时遇到一个问题。我有来自服务的json响应: 我使用spring WebFlux的新WebClient获得了这个json,代码如下: AccountorDerList AccountOrder是一个映射字段的简单pojo。 实际上,当我点击get时,它说: 如何使用新的webflux模块正确反序列化json?我做错了什么? 更新05/02/2018 两个答案

  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。