在Netstandard1.0中将JSON反序列化为对象



我正在尝试序列化从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\":\"密码",\"错误\":[\"密码字段为必填项。\"]},{\"key\":\"用户名",\"错误\":[\"用户名字段为必填项。\"]},{\"key\":\">

OrganizationUserName",\"errors\":[\"组织用户名字段为必填项。\"]}]">

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

如果按如下方式定义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 容器是一个数组,而不是一个对象。 如标准中所述,JSON 有两种类型的容器:

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

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

    在 Json.NET 序列化指南:IEnumerable、List 和 Arrays中,解释了 JSON 数组在实现IEnumerable的 .Net 类型之间进行转换。 所以这就是你需要做的。

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

    Data = list.SingleOrDefault();
    

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

样品小提琴。

相关内容

  • 没有找到相关文章

最新更新