将 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 有两种类型的容器:
一个数组,它是值的有序集合。数组以 [
(左括号)开始,以 ]
(右括号)结束。值由 ,
(逗号)分隔。
一个对象,它是 name/value 对的无序集合。对象以 {
(左大括号)开始,以 }
(右大括号)结束。
在Json.NETSerialization Guide: IEnumerable, Lists, and Arrays中解释说JSON数组与.Net类型相互转换实施 IEnumerable
。这就是你需要做的。
如果您知道数组将只包含一个元素,您可以使用 SingleOrDefault()
来提取单个元素:
Data = list.SingleOrDefault();
但是,在您问题中包含的示例中,外部数组有 3 个项目,因此这是不合适的。
示例 fiddle.
我正在尝试序列化从 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 有两种类型的容器:一个数组,它是值的有序集合。数组以
[
(左括号)开始,以]
(右括号)结束。值由,
(逗号)分隔。一个对象,它是 name/value 对的无序集合。对象以
{
(左大括号)开始,以}
(右大括号)结束。
在Json.NETSerialization Guide: IEnumerable, Lists, and Arrays中解释说JSON数组与.Net类型相互转换实施
IEnumerable
。这就是你需要做的。如果您知道数组将只包含一个元素,您可以使用
SingleOrDefault()
来提取单个元素:Data = list.SingleOrDefault();
但是,在您问题中包含的示例中,外部数组有 3 个项目,因此这是不合适的。
示例 fiddle.