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

C#中如何序列化/反序列化混合对象与对象列表的JSON?

处理混合类型数组的Newtonsoft.Json序列化/反序列化方案

针对你遇到的顶层数组同时包含单个对象和对象数组的JSON格式,这里提供两种可行的处理方式:

1. 自定义JsonConverter(推荐,可复用)

首先确保你已经定义了对应的实体类:

public class FieldValue
{
    public string value { get; set; }
    public string field { get; set; }
}

创建一个自定义转换器,自动处理单个对象和数组的混合情况,最终输出扁平化的List<FieldValue>:

public class MixedArrayConverter : JsonConverter<List<FieldValue>>
{
    public override List<FieldValue> ReadJson(JsonReader reader, Type objectType, List<FieldValue> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var result = new List<FieldValue>();
        if (reader.TokenType != JsonToken.StartArray) return result;

        while (reader.Read())
        {
            if (reader.TokenType == JsonToken.EndArray) break;

            // 处理单个对象
            if (reader.TokenType == JsonToken.StartObject)
            {
                var item = serializer.Deserialize<FieldValue>(reader);
                result.Add(item);
            }
            // 处理嵌套数组
            else if (reader.TokenType == JsonToken.StartArray)
            {
                var subItems = serializer.Deserialize<List<FieldValue>>(reader);
                result.AddRange(subItems);
            }
        }
        return result;
    }

    public override void WriteJson(JsonWriter writer, List<FieldValue> value, JsonSerializer serializer)
    {
        // 若需要序列化回原混合格式,可在此添加分组逻辑,以下默认输出全单个对象的数组
        writer.WriteStartArray();
        foreach (var item in value)
        {
            serializer.Serialize(writer, item);
        }
        writer.WriteEndArray();
    }
}

使用方式:

string jsonStr = "你的目标JSON字符串";
var settings = new JsonSerializerSettings
{
    Converters = { new MixedArrayConverter() }
};
List<FieldValue> data = JsonConvert.DeserializeObject<List<FieldValue>>(jsonStr, settings);

2. 直接处理JToken(快速临时方案)

如果不需要复用逻辑,可以直接解析JSON的Token结构,手动处理混合元素:

string jsonStr = "你的目标JSON字符串";
var rawElements = JsonConvert.DeserializeObject<List<object>>(jsonStr);
var finalData = new List<FieldValue>();

foreach (var element in rawElements)
{
    if (element is JObject singleObj)
    {
        finalData.Add(singleObj.ToObject<FieldValue>());
    }
    else if (element is JArray subArray)
    {
        finalData.AddRange(subArray.ToObject<List<FieldValue>>());
    }
}

两种方式都能完美处理给定的JSON格式,根据你的场景选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:12:51