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

使用强类型模型返回自定义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的实现

  1. 编写自定义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();
    }
}
  1. 给Data属性加特性启用Converter:
public class MyModel
{
    [JsonConverter(typeof(TupleToDynamicObjectArrayConverter))]
    public Tuple<string, string> Data { get; set; }
}

针对Newtonsoft.Json的实现

  1. 编写自定义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();
    }
}
  1. 给Data属性加特性启用Converter:
public class MyModel
{
    [JsonConverter(typeof(TupleToDynamicObjectArrayConverter))]
    public Tuple<string, string> Data { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:27:05