.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
相关产品推荐
相关产品推荐

