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

如何让API返回的JSON中自定义类型属性直接输出值而非嵌套结构?

当然可以实现!

这是.NET生态里很常见的自定义JSON序列化需求,根据你使用的序列化库不同,有两种成熟的解决方案:

1. 使用System.Text.Json(.NET Core 3.0+ 或 .NET 5+ 默认库)

你需要自定义一个JsonConverter<MyValue>来控制MyValue类型的序列化/反序列化逻辑:

using System.Text.Json;
using System.Text.Json.Serialization;

public class MyValueConverter : JsonConverter<MyValue>
{
    // 序列化:将MyValue对象直接转为对应的int值
    public override void Write(Utf8JsonWriter writer, MyValue value, JsonSerializerOptions options)
    {
        writer.WriteNumberValue(value.Value);
    }

    // 反序列化:将JSON中的int值转回MyValue对象
    public override MyValue Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Number)
        {
            return new MyValue(reader.GetInt32());
        }
        throw new JsonException("Expected a numeric value for MyValue type");
    }
}

应用这个转换器有两种方式:

  • 方式一:在类上直接标注特性
    给你的MyValue类添加特性,让所有用到该类的属性自动应用转换规则:
[JsonConverter(typeof(MyValueConverter))]
public class MyValue 
{ 
    public MyValue(int v) { Value = v; } 
    public int Value { get; } 
}
  • 方式二:全局配置转换器
    如果不想修改MyValue类,可以在序列化时传入配置好的JsonSerializerOptions:
var serializeOptions = new JsonSerializerOptions();
serializeOptions.Converters.Add(new MyValueConverter());

// 序列化时使用该配置
string jsonResult = JsonSerializer.Serialize(yourApiResponseObject, serializeOptions);

2. 使用Newtonsoft.Json(Json.NET)

如果你的项目依赖Json.NET,同样需要自定义转换器:

using Newtonsoft.Json;

public class MyValueNewtonsoftConverter : JsonConverter<MyValue>
{
    public override void WriteJson(JsonWriter writer, MyValue value, JsonSerializer serializer)
    {
        writer.WriteValue(value.Value);
    }

    public override MyValue ReadJson(JsonReader reader, Type objectType, MyValue existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Integer)
        {
            return new MyValue(Convert.ToInt32(reader.Value));
        }
        throw new JsonException("Expected an integer value for MyValue type");
    }
}

应用方式同样有两种:

  • 特性标注
    在MyValue类上添加对应特性:
[JsonConverter(typeof(MyValueNewtonsoftConverter))]
public class MyValue 
{ 
    public MyValue(int v) { Value = v; } 
    public int Value { get; } 
}
  • 全局配置
    序列化时传入配置好的JsonSerializerSettings:
var serializeSettings = new JsonSerializerSettings();
serializeSettings.Converters.Add(new MyValueNewtonsoftConverter());

string jsonResult = JsonConvert.SerializeObject(yourApiResponseObject, serializeSettings);

完成以上配置后,你的API返回的JSON就会变成你期望的格式:"propertyOfTypeMyValue": 4,同时反序列化时也能正常将数字转回MyValue对象,不会破坏数据流转逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:07:38