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

.NET中如何通过对象属性值动态设置JSON字段名并序列化?

用Newtonsoft.Json根据对象属性值设置JSON字段名序列化对象

要实现把Data类的Question属性值作为顶级JSON键、并将Answer嵌套在该键下的序列化需求,用Newtonsoft.Json有两种常用方案:

方法一:手动构造JObject(适合简单一次性场景)

直接用JObject构建目标JSON结构,操作简单直观:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

var data = new Data();
var jsonObj = new JObject
{
    { data.Question, new JObject { { "Answer", data.Answer } } }
};
// 生成带缩进的格式化JSON
string json = jsonObj.ToString(Formatting.Indented);

输出的JSON就是你要的格式:

{
  "Test Question?": {
    "Answer": "5"
  }
}

方法二:自定义JsonConverter(适合重复序列化场景)

如果需要多次序列化Data类,或者希望序列化逻辑和类绑定,可以自定义转换器:

1. 实现转换器类

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class DataConverter : JsonConverter<Data>
{
    public override void WriteJson(JsonWriter writer, Data value, JsonSerializer serializer)
    {
        var targetJson = new JObject
        {
            { value.Question, new JObject { { "Answer", value.Answer } } }
        };
        targetJson.WriteTo(writer);
    }

    public override Data ReadJson(JsonReader reader, Type objectType, Data existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 若需要支持反序列化,可在这里补充逻辑
        throw new NotImplementedException("暂未实现反序列化");
    }
}

2. 使用转换器

有两种使用方式:

方式A:给Data类加特性标记

修改Data类,添加转换器特性,后续序列化自动生效:

[JsonConverter(typeof(DataConverter))]
public class Data
{
    public string Question { get; set; } = "Test Question?";
    public string Answer { get; set; } = "5";
}

// 正常调用序列化方法即可
var data = new Data();
string json = JsonConvert.SerializeObject(data, Formatting.Indented);

方式B:序列化时传入转换器

不想修改类的话,序列化时直接指定转换器:

var data = new Data();
string json = JsonConvert.SerializeObject(data, new DataConverter(), Formatting.Indented);

两种方式都能生成符合要求的JSON。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:47:22