我正在尝试序列化从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()
时,我得到以下格式的结果。
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 有两种类型的容器:一个数组,它是值的有序集合。数组以
[
(左括号)开头,以]
(右括号)结尾。值用,
(逗号)分隔。一个对象,它是一组无序的名称/值对。对象以
{
(左大括号)开头,以}
(右大括号)结尾。
在 Json.NET 序列化指南:IEnumerable、List 和 Arrays中,解释了 JSON 数组在实现
IEnumerable
的 .Net 类型之间进行转换。 所以这就是你需要做的。如果您知道数组将包含不超过一个元素,则可以使用
SingleOrDefault()
来提取该单个元素:Data = list.SingleOrDefault();
但是,在您问题中包含的示例中,外部数组有 3 个项目,因此这不合适。
样品小提琴。