我正在尝试序列化从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字段。\ “]}]”
有谁知道如何反序列化这种格式?
答案 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有两种类型的容器:
一个数组,它是一个有序的值集合。数组以[
(左括号)开头,以]
(右括号)结尾。值以,
(逗号)分隔。
一个对象,它是一组无序的名称/值对。对象以{
(左大括号)开头,以}
(右大括号)结束。
在Json.NET Serialization Guide: IEnumerable, Lists, and Arrays 中,解释了JSON数组是从实现IEnumerable
的.Net类型转换而来。这就是你需要做的事情。
如果您知道数组中只包含一个元素,则可以使用SingleOrDefault()
来提取该单个元素:
Data = list.SingleOrDefault();
但是,在您提问的示例中,外部数组有3个项目,因此这不合适。
示例fiddle。