如何让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
相关产品推荐
相关产品推荐

