使用强类型模型返回自定义JSON响应,修改Tuple序列化输出格式
解决方案
你可以通过以下两种方案实现需求,两种都不需要提前固定属性名:
方案1:调整模型结构(最简单,优先推荐)
直接把Data属性的类型改为List<Dictionary<string, string>>,字典天然支持动态键值对序列化,外层List对应你要的数组结构:
public class MyModel { // 修改属性类型 public List<Dictionary<string, string>> Data { get; set; } } // 赋值示例 var data = new MyModel { Data = new List<Dictionary<string, string>> { new Dictionary<string, string> { {"error", "12345"} } } };
序列化后就会直接得到你期望的格式。
方案2:自定义JsonConverter(如果不能修改现有MyModel结构时使用)
如果必须保留原模型的Tuple<string, string> Data属性定义,你可以通过自定义序列化转换器实现动态键生成,下面分别给出.NET默认System.Text.Json和Newtonsoft.Json两种常用序列化组件的实现:
针对System.Text.Json的实现
- 编写自定义Converter:
using System.Text.Json; using System.Text.Json.Serialization; public class TupleToDynamicObjectArrayConverter : JsonConverter<Tuple<string, string>> { public override Tuple<string, string>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 反序列化逻辑如果不需要可以直接抛出NotImplementedException throw new NotImplementedException(); } public override void Write(Utf8JsonWriter writer, Tuple<string, string> value, JsonSerializerOptions options) { // 先写数组开头 writer.WriteStartArray(); // 写动态对象 writer.WriteStartObject(); writer.WriteString(value.Item1, value.Item2); writer.WriteEndObject(); // 写数组结尾 writer.WriteEndArray(); } }
- 给Data属性加特性启用Converter:
public class MyModel { [JsonConverter(typeof(TupleToDynamicObjectArrayConverter))] public Tuple<string, string> Data { get; set; } }
针对Newtonsoft.Json的实现
- 编写自定义Converter:
using Newtonsoft.Json; public class TupleToDynamicObjectArrayConverter : JsonConverter<Tuple<string, string>> { public override Tuple<string, string>? ReadJson(JsonReader reader, Type objectType, Tuple<string, string>? existingValue, bool hasExistingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, Tuple<string, string>? value, JsonSerializer serializer) { writer.WriteStartArray(); writer.WriteStartObject(); writer.WritePropertyName(value.Item1); writer.WriteValue(value.Item2); writer.WriteEndObject(); writer.WriteEndArray(); } }
- 给Data属性加特性启用Converter:
public class MyModel { [JsonConverter(typeof(TupleToDynamicObjectArrayConverter))] public Tuple<string, string> Data { get; set; } }
内容的提问来源于stack exchange,提问作者user1765862
相关产品推荐
相关产品推荐

