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

如何用一个Output类处理API返回的两种不同结构响应?

用同一类兼容两种JSON响应的解决方案

要解决API返回两种不同格式info字段的反序列化问题,核心是通过自定义Json转换器动态处理对象和数组两种结构,具体步骤如下:

1. 定义自定义Json转换器

创建继承自JsonConverter<List<string>>的转换器,在反序列化时判断当前JSON节点类型,分别处理对象和数组场景:

public class InfoConverter : JsonConverter<List<string>>
{
    public override List<string> ReadJson(JsonReader reader, Type objectType, List<string> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var infoList = new List<string>();
        
        // 处理info为JSON对象的情况
        if (reader.TokenType == JsonToken.StartObject)
        {
            var infoObj = JObject.Load(reader);
            // 可根据需求提取字段,比如提取number字段转为字符串加入列表
            var numberStr = infoObj["number"]?.ToString();
            if (!string.IsNullOrEmpty(numberStr))
            {
                infoList.Add(numberStr);
            }
            // 若需要将整个对象转为JSON字符串存入列表,替换为:
            // infoList.Add(infoObj.ToString(Formatting.None));
        }
        // 处理info为字符串数组的情况
        else if (reader.TokenType == JsonToken.StartArray)
        {
            infoList = serializer.Deserialize<List<string>>(reader);
        }
        
        return infoList;
    }

    public override void WriteJson(JsonWriter writer, List<string> value, JsonSerializer serializer)
    {
        // 序列化时默认输出为数组,可根据需求调整逻辑
        serializer.Serialize(writer, value);
    }
}

2. 在Output类中应用转换器

在Info属性上标记[JsonConverter]特性,指定使用上述自定义转换器:

public class Output
{
    [JsonConverter(typeof(InfoConverter))]
    public List<string> Info { get; set; }
}

3. 反序列化测试

针对两种响应格式,均可正常反序列化为Output类:

// 响应1(info为对象)
var response1 = "{\"info\": {\"id\": \"001\", \"number\": \"9527\"}}";
var output1 = JsonConvert.DeserializeObject<Output>(response1);
// output1.Info = ["9527"](或自定义处理后的内容)

// 响应2(info为字符串数组)
var response2 = "{\"info\": [\"user1\", \"user2\", \"user3\"]}";
var output2 = JsonConvert.DeserializeObject<Output>(response2);
// output2.Info = ["user1", "user2", "user3"]

注意事项

  • 转换器中的对象处理逻辑可根据实际需求调整,比如提取多个字段拼接成字符串、保留整个对象的JSON格式等。
  • 若不需要支持序列化,WriteJson方法可留空或抛出NotImplementedException,但建议实现基础序列化逻辑保证双向兼容性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:12:23