如何将含数组的JSON反序列化为带Dictionary的.NET复杂对象?
解决JSON数组反序列化为Dictionary的问题
问题原因
JSON里的ItensFila是由key/value对象组成的数组,但C#实体类Fila中对应的属性是Dictionary<string, ItemFila>。Newtonsoft.Json默认仅支持将JSON键值对对象反序列化为Dictionary,数组形式无法直接匹配,因此抛出序列化异常。
方法一:自定义JsonConverter
编写自定义转换器,手动处理数组到Dictionary的转换逻辑:
public class KeyValueArrayToDictionaryConverter : JsonConverter<Dictionary<string, ItemFila>> { public override Dictionary<string, ItemFila> ReadJson(JsonReader reader, Type objectType, Dictionary<string, ItemFila> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 将JSON数组反序列化为临时键值对列表 var keyValuePairs = serializer.Deserialize<List<KeyValuePair<string, ItemFila>>>(reader); return keyValuePairs?.ToDictionary(kvp => kvp.Key, kvp => kvp.Value) ?? new Dictionary<string, ItemFila>(); } public override void WriteJson(JsonWriter writer, Dictionary<string, ItemFila> value, JsonSerializer serializer) { // 如需序列化回JSON,可在此处理Dictionary转数组逻辑 serializer.Serialize(writer, value.Select(kvp => new { key = kvp.Key, value = kvp.Value })); } }
给Fila类的ItensFila属性添加特性标记:
public class Fila { // 其他属性... [JsonConverter(typeof(KeyValueArrayToDictionaryConverter))] public Dictionary<string, ItemFila> ItensFila { get; set; } // 其他属性... }
之后直接用常规方式反序列化即可:
var fila = JsonConvert.DeserializeObject<Fila>(jsonString);
方法二:先转中间类型再转换
如果不想编写转换器,可以先定义与JSON结构完全匹配的中间类,再手动转换为目标实体:
// 中间类,用列表接收ItensFila public class FilaIntermediaria { public int Id { get; set; } public string Etiqueta { get; set; } public bool Urgente { get; set; } public int IdSolicitacao { get; set; } public DateTime DataCriacao { get; set; } public Entidade Entidade { get; set; } public Empresa Empresa { get; set; } public List<KeyValuePair<string, ItemFila>> ItensFila { get; set; } public string Risco { get; set; } }
反序列化时先转中间类,再转换为目标Fila对象:
var filaIntermediaria = JsonConvert.DeserializeObject<FilaIntermediaria>(jsonString); var fila = new Fila { Id = filaIntermediaria.Id, Etiqueta = filaIntermediaria.Etiqueta, Urgente = filaIntermediaria.Urgente, IdSolicitacao = filaIntermediaria.IdSolicitacao, DataCriacao = filaIntermediaria.DataCriacao, Entidade = filaIntermediaria.Entidade, Empresa = filaIntermediaria.Empresa, ItensFila = filaIntermediaria.ItensFila?.ToDictionary(kvp => kvp.Key, kvp => kvp.Value) ?? new Dictionary<string, ItemFila>(), Risco = filaIntermediaria.Risco };
内容的提问来源于stack exchange,提问作者Andy Schmitt
相关产品推荐
相关产品推荐

