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

deserialize json to object in netstandard1.0

我正在尝试序列化从 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\":[\"The Password field is required.\"]},{\"key\":\"UserName\",\"errors\":[\"The UserName field is required.\"]},{\"key\":\"OrganizationUserName\",\"errors\":[\"The OrganizationUserName field is required.\" ]}]"

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

如果您定义 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. 一个对象,它是 name/value 对的无序集合。对象以 {(左大括号)开始,以 }(右大括号)结束。

    在Json.NETSerialization Guide: IEnumerable, Lists, and Arrays中解释说JSON数组与.Net类型相互转换实施 IEnumerable。这就是你需要做的。

  • 如果您知道数组将只包含一个元素,您可以使用 SingleOrDefault() 来提取单个元素:

    Data = list.SingleOrDefault();
    

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

示例 fiddle.