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

C#中处理API返回attachments字段数组/对象不一致问题求助

处理API响应中attachments时而为数组时而为对象的问题

外部API返回的attachments字段类型不一致(有时是数组、有时是单个对象),导致C#实体类反序列化时报错,这是第三方API常见的不规范返回问题,以下是两种主流序列化库的解决办法:

使用Newtonsoft.Json(Json.NET)解决

  1. 自定义JSON转换器,处理对象/数组的兼容转换:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

public class AttachmentsConverter : JsonConverter<List<Attachments>>
{
    public override List<Attachments> ReadJson(JsonReader reader, Type objectType, List<Attachments> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        if (token.Type == JTokenType.Object)
        {
            // 单个对象转为包含该对象的列表
            var attachment = token.ToObject<Attachments>();
            return new List<Attachments> { attachment };
        }
        else if (token.Type == JTokenType.Array)
        {
            // 正常反序列化为列表
            return token.ToObject<List<Attachments>>();
        }
        return new List<Attachments>();
    }

    public override void WriteJson(JsonWriter writer, List<Attachments> value, JsonSerializer serializer)
    {
        // 序列化时如果列表只有一个元素,转为单个对象(可选,根据需求调整)
        if (value.Count == 1)
        {
            serializer.Serialize(writer, value[0]);
        }
        else
        {
            serializer.Serialize(writer, value);
        }
    }
}
  1. 在实体类的attachments属性上添加转换器特性:
public class Attachments
{
    public string idAttachment { get; set; }
    public string attachmentPath { get; set; }
}

public class Root
{
    public string emplooye { get; set; }
    public string age { get; set; }
    [JsonConverter(typeof(AttachmentsConverter))]
    public List<Attachments> attachments { get; set; } = new List<Attachments>();
}

使用System.Text.Json解决(.NET Core/.NET 5+)

  1. 自定义JSON转换器:
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

public class AttachmentsSystemTextJsonConverter : JsonConverter<List<Attachments>>
{
    public override List<Attachments> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.StartObject)
        {
            var attachment = JsonSerializer.Deserialize<Attachments>(ref reader, options);
            return new List<Attachments> { attachment };
        }
        else if (reader.TokenType == JsonTokenType.StartArray)
        {
            return JsonSerializer.Deserialize<List<Attachments>>(ref reader, options);
        }
        return new List<Attachments>();
    }

    public override void Write(Utf8JsonWriter writer, List<Attachments> value, JsonSerializerOptions options)
    {
        if (value.Count == 1)
        {
            JsonSerializer.Serialize(writer, value[0], options);
        }
        else
        {
            JsonSerializer.Serialize(writer, value, options);
        }
    }
}
  1. 修改实体类属性:
public class Attachments
{
    public string idAttachment { get; set; }
    public string attachmentPath { get; set; }
}

public class Root
{
    public string emplooye { get; set; }
    public string age { get; set; }
    [JsonConverter(typeof(AttachmentsSystemTextJsonConverter))]
    public List<Attachments> attachments { get; set; } = new List<Attachments>();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:05:31