You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含数组的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:47