在netstandard1.0中将json反序列化为对象

时间:2017-11-04 00:50:01

标签: json serialization json.net .net-standard httpresponsemessage

我正在尝试序列化从http响应返回的字符串,而我正在使用netstandard1.0。在这个框架中没有很多序列化函数可以工作,但我终于找到了一个工作函数。到目前为止,这是我的代码:

HttpResponseMessage Response = // initialized else where
var jsonTask = Response.Content.ReadAsStringAsync();
if (!jsonTask.IsCompleted) jsonTask.RunSynchronously();
string json = jsonTask.Result;
Data = JsonConvert.DeserializeObject<MyModel>(json);

然而,这并没有反序列化我从http响应。它会抛出DeserializeObject函数正在寻找不同格式的错误。当我运行Result.Content.ReadAsStringAsync()时,我会得到以下格式的结果。

“[{\”key \“:\”Password \“,\”errors \“:[\”密码字段是必需的。\“]},{\”key \“:\”UserName \“ ,\“errors \”:[\“UserName字段是必需的。\”]},{\“key \”:\“OrganizationUserName \”,\“errors \”:[\“需要OrganizationUserName字段。\ “]}]”

有谁知道如何反序列化这种格式?

1 个答案:

答案 0 :(得分:1)

如果您按如下方式定义MyModel

public class MyModel
{
    public string key { get; set; }
    public List<string> errors { get; set; }
}

您可以按如下方式反序列化:

var list = JsonConvert.DeserializeObject<List<MyModel>>(json);

注意:

  • 我通过将您的JSON上传到http://json2csharp.com/来为MyModel生成了c#定义。

  • 您看到尝试直接反序列化为MyModel的异常的原因是您的外部JSON容器是一个数组,而不是一个对象。正如standard中所解释的,JSON有两种类型的容器:

    1. 一个数组,它是一个有序的值集合。数组以[(左括号)开头,以](右括号)结尾。值以,(逗号)分隔。

    2. 一个对象,它是一组无序的名称/值对。对象以{(左大括号)开头,以}(右大括号)结束。

    3. 在Json.NET Serialization Guide: IEnumerable, Lists, and Arrays 中,解释了JSON数组是从实现IEnumerable的.Net类型转换而来。这就是你需要做的事情。

    4. 如果您知道数组中只包含一个元素,则可以使用SingleOrDefault()来提取该单个元素:

      Data = list.SingleOrDefault();
      

      但是,在您提问的示例中,外部数组有3个项目,因此这不合适。

示例fiddle