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

C#反序列化未知JSON:处理termene字段类型不一致问题

解决JSON反序列化中字段时而为数组时而为对象/字符串的问题

针对公共Web服务返回JSON里termene字段类型不固定(时而数组、时而单个对象/字符串)导致的反序列化失败问题,用自定义JSON转换器就能解决,步骤如下:

1. 编写自定义JsonConverter

创建一个继承自JsonConverter<List<TermeneICCJ>>的转换器类,统一处理不同类型的输入:

public class TermeneConverter : JsonConverter<List<TermeneICCJ>>
{
    public override List<TermeneICCJ> ReadJson(JsonReader reader, Type objectType, List<TermeneICCJ> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var result = new List<TermeneICCJ>();
        
        // 处理数组类型的termene
        if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize<List<TermeneICCJ>>(reader);
        }
        // 处理单个对象类型的termene
        else if (reader.TokenType == JsonToken.StartObject)
        {
            var singleItem = serializer.Deserialize<TermeneICCJ>(reader);
            if (singleItem != null)
            {
                result.Add(singleItem);
            }
        }
        // 处理字符串类型的termene(如空字符串或无效值,直接返回空列表)
        else if (reader.TokenType == JsonToken.String)
        {
            // 若字符串是可解析的JSON,可自行添加解析逻辑;否则保持空列表
        }
        
        return result;
    }

    public override void WriteJson(JsonWriter writer, List<TermeneICCJ> value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

2. 给termene字段绑定转换器

修改DosareICCJ类的termene字段,添加转换器标记:

public class DosareICCJ
{
    // 其他字段保持不变...
    public List<PartiICCJ> parti { get; set; }      
    [JsonConverter(typeof(TermeneConverter))] // 添加此行绑定转换器
    public List<TermeneICCJ> termene { get; set; }
    public List<CaiAtacICCJ> caiAtac { get; set; }
}

3. 保留原反序列化代码

你原来的请求和反序列化代码无需修改,直接运行即可:

List<DosareICCJ> result;
var url = "some url that works";

var httpRequest = (HttpWebRequest)WebRequest.Create(url);
var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
var streamReader = new StreamReader(httpResponse.GetResponseStream());

var callresult = streamReader.ReadToEnd();
result = JsonConvert.DeserializeObject<List<DosareICCJ>>(callresult);

return result;

这个转换器会自动适配termene字段的不同类型:数组直接转为列表,单个对象包装成列表,无效字符串则返回空列表,完全兼容Web服务的不稳定输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:40:17