为什么 Newtonsoft JsonConvert 不反序列化 Json 数组字段?
Why does Newtonsoft JsonConvert not deserialize Json array fields?
我正在获取一个 Json 对象,它有一个 Details 字段,它是一个 Detail 对象数组,例如:
"details":"[{\"field_id\":\"1142488407\",\"response\":\"256\",\"field_type\":\"text\"},{\"field_id\":\"72403497\",\"response\":\"\",\"field_type\":\"text\"},{\"field_id\":\"845605582\",\"response\":\"Michael\",\"field_type\":\"text\"},{\"field_id\":\"987024660\",\"response\":\"157\",\"field_type\":\"dropdown\"}]"
我的详细信息字段模型是:
[JsonProperty("details")]
public List<LogDetailModel> DetailModels { get; set; }
Detail 对象模型为:
[JsonProperty("field_id")]
public string EditedFieldId { get; set; }
[JsonProperty("response")]
public string Response { get; set; }
[JsonProperty("field_type")]
public string FieldType { get; set; }
但是,当我尝试反序列化结果(我的基本模型的数组)时,我得到以下信息:
JsonSerializationException: Error converting value "[{"field_id":"1142488407","response":"256","field_type":"text"},{"field_id":"72403497","response":"","field_type":"text"},{"field_id":"845605582","response":"Michael","field_type":"text"},{"field_id":"987024660","response":"157","field_type":"dropdown"}]" to type 'System.Collections.Generic.List`1[KolHalev.Business.Breeze.Models.LogDetailModel]'. Path '[0].details', line 1, position 423.
如果我改为将该字段作为字符串获取,然后反序列化:
[JsonProperty("details")]
public string Details { get; set; }
public List<LogDetailModel> DetailModels { get { return JsonConvert.DeserializeObject<List<LogDetailModel>>(Details); } }
这很好用。我错过了什么?
试试这个
Details details = JsonConvert.DeserializeObject<Details>(json);
//Or more flexible
//Detail details = new Details
//{
// DetailsString = (string)JObject.Parse(json)["details"]
//};
类
public class Details
{
[JsonProperty("details")]
public string DetailsString { get; set; }
public List<LogDetailModel> DetailModels { get { return JsonConvert.DeserializeObject<List<LogDetailModel>>(DetailsString); } }
}
public class LogDetailModel
{
[JsonProperty("field_id")]
public string EditedFieldId { get; set; }
[JsonProperty("response")]
public string Response { get; set; }
[JsonProperty("field_type")]
public string FieldType { get; set; }
}
你不能直接反序列化的原因是你的json和你的数据模型不匹配。
"details":"[{\"field_id\":\"1142488407\",\"response\":\"256\",\"field_type\":\"text\"},..]"
- 在这种情况下,您的
details
数据类型是字符串
- 因此,您不能将其直接解析为对象集合
如果您的 json 看起来像这样:
"details":[{\"field_id\":\"1142488407\",\"response\":\"256\",\"field_type\":\"text\"},..]
details
字段的数据类型将是一个集合
因此,您的第二种方法之所以奏效,是因为您首先反序列化了 details
,然后反序列化了 json 数组。
我正在获取一个 Json 对象,它有一个 Details 字段,它是一个 Detail 对象数组,例如:
"details":"[{\"field_id\":\"1142488407\",\"response\":\"256\",\"field_type\":\"text\"},{\"field_id\":\"72403497\",\"response\":\"\",\"field_type\":\"text\"},{\"field_id\":\"845605582\",\"response\":\"Michael\",\"field_type\":\"text\"},{\"field_id\":\"987024660\",\"response\":\"157\",\"field_type\":\"dropdown\"}]"
我的详细信息字段模型是:
[JsonProperty("details")]
public List<LogDetailModel> DetailModels { get; set; }
Detail 对象模型为:
[JsonProperty("field_id")]
public string EditedFieldId { get; set; }
[JsonProperty("response")]
public string Response { get; set; }
[JsonProperty("field_type")]
public string FieldType { get; set; }
但是,当我尝试反序列化结果(我的基本模型的数组)时,我得到以下信息:
JsonSerializationException: Error converting value "[{"field_id":"1142488407","response":"256","field_type":"text"},{"field_id":"72403497","response":"","field_type":"text"},{"field_id":"845605582","response":"Michael","field_type":"text"},{"field_id":"987024660","response":"157","field_type":"dropdown"}]" to type 'System.Collections.Generic.List`1[KolHalev.Business.Breeze.Models.LogDetailModel]'. Path '[0].details', line 1, position 423.
如果我改为将该字段作为字符串获取,然后反序列化:
[JsonProperty("details")]
public string Details { get; set; }
public List<LogDetailModel> DetailModels { get { return JsonConvert.DeserializeObject<List<LogDetailModel>>(Details); } }
这很好用。我错过了什么?
试试这个
Details details = JsonConvert.DeserializeObject<Details>(json);
//Or more flexible
//Detail details = new Details
//{
// DetailsString = (string)JObject.Parse(json)["details"]
//};
类
public class Details
{
[JsonProperty("details")]
public string DetailsString { get; set; }
public List<LogDetailModel> DetailModels { get { return JsonConvert.DeserializeObject<List<LogDetailModel>>(DetailsString); } }
}
public class LogDetailModel
{
[JsonProperty("field_id")]
public string EditedFieldId { get; set; }
[JsonProperty("response")]
public string Response { get; set; }
[JsonProperty("field_type")]
public string FieldType { get; set; }
}
你不能直接反序列化的原因是你的json和你的数据模型不匹配。
"details":"[{\"field_id\":\"1142488407\",\"response\":\"256\",\"field_type\":\"text\"},..]"
- 在这种情况下,您的
details
数据类型是字符串 - 因此,您不能将其直接解析为对象集合
如果您的 json 看起来像这样:
"details":[{\"field_id\":\"1142488407\",\"response\":\"256\",\"field_type\":\"text\"},..]
details
字段的数据类型将是一个集合
因此,您的第二种方法之所以奏效,是因为您首先反序列化了 details
,然后反序列化了 json 数组。