为什么 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 数组。