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\":[\"密码字段为必填项。\"]},{\"key\":\"UserName\",\" errors\":[\"UserName 字段是必需的。\"]},{\"key\":\"OrganizationUserName\",\"errors\":[\"OrganizationUserName 字段是必需的。\"]} ]"

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

4

1 回答 1

1

如果您定义MyModel如下:

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

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

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

笔记:

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

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

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

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

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

  • 如果您知道数组将包含不超过一个元素,则可以使用SingleOrDefault()提取该单个元素:

    Data = list.SingleOrDefault();
    

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

样品小提琴

于 2017-11-04T01:12:03.133 回答