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

如何反序列化同时含数组与对象类型的images节点JSON数据?

解决方案

要兼容images字段的数组和对象两种形态,最可靠的方式是自定义JSON转换器,在反序列化时根据字段类型动态处理。以下是具体实现步骤:

1. 调整类结构

优化类定义,用Dictionary<string, List<White>>统一接收images的两种形态(空数组对应空字典,对象对应键值对),更贴合JSON实际结构:

public class TestClass
{
    public List<Variant> variants { get; set; }
}

public class Variant
{
    public string name { get; set; }
    public string description { get; set; }
    // 标记使用自定义转换器
    [JsonConverter(typeof(ImagesConverter))]
    public Dictionary<string, List<White>> images { get; set; }
}

public class White
{
    public string id { get; set; }
    public string product_id { get; set; }
}

2. 实现自定义JSON转换器

创建继承自JsonConverter<T>的转换器,判断images的Token类型并分别处理:

public class ImagesConverter : JsonConverter<Dictionary<string, List<White>>>
{
    public override Dictionary<string, List<White>> ReadJson(JsonReader reader, Type objectType, Dictionary<string, List<White>> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 处理空数组情况
        if (reader.TokenType == JsonToken.StartArray)
        {
            reader.Skip(); // 跳过整个空数组节点
            return new Dictionary<string, List<White>>();
        }
        // 处理对象类型情况
        else if (reader.TokenType == JsonToken.StartObject)
        {
            return serializer.Deserialize<Dictionary<string, List<White>>>(reader);
        }
        // 其他未知类型返回空字典
        return new Dictionary<string, List<White>>();
    }

    // 可选:处理序列化逻辑
    public override void WriteJson(JsonWriter writer, Dictionary<string, List<White>> value, JsonSerializer serializer)
    {
        if (value == null || !value.Any())
        {
            writer.WriteStartArray();
            writer.WriteEndArray();
        }
        else
        {
            serializer.Serialize(writer, value);
        }
    }
}

3. 执行反序列化

直接用原有代码完成反序列化,转换器会自动适配两种images形态:

var items = JsonConvert.DeserializeObject<TestClass>(content);

补充:保留原List<Image>结构的适配方案

如果要坚持使用原有的List<Image>定义,可修改转换器逻辑:

public class ImagesConverter : JsonConverter<List<Image>>
{
    public override List<Image> ReadJson(JsonReader reader, Type objectType, List<Image> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
        {
            reader.Skip();
            return new List<Image>();
        }
        else if (reader.TokenType == JsonToken.StartObject)
        {
            var dict = serializer.Deserialize<Dictionary<string, List<White>>>(reader);
            return dict.Select(kv => new Image { White = kv.Value }).ToList();
        }
        return new List<Image>();
    }

    public override void WriteJson(JsonWriter writer, List<Image> value, JsonSerializer serializer)
    {
        if (value == null || !value.Any())
        {
            writer.WriteStartArray();
            writer.WriteEndArray();
        }
        else
        {
            var dict = value.ToDictionary(img => "WHITE", img => img.White);
            serializer.Serialize(writer, dict);
        }
    }
}

此时Variant类的images属性保持原定义,只需添加[JsonConverter(typeof(ImagesConverter))]特性即可。


内容的提问来源于stack exchange,提问作者Naw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:40:33