如何用Newtonsoft.Json将对象序列化为无字段名单键值对JSON?
解决方案:通过自定义JsonConverter实现目标序列化格式
不需要创建单项字典,你可以通过自定义Json.NET转换器来实现需求,直接将包含Key和Items的对象序列化为以Key值为键、Items为对应值的JSON结构。
步骤1:实现自定义JsonConverter
创建一个转换器,专门处理包含Key和Items属性的对象:
public class KeyItemsConverter : JsonConverter { public override bool CanConvert(Type objectType) { // 验证对象是否包含Key和Items属性 var hasKeyProp = objectType.GetProperty("Key") != null; var hasItemsProp = objectType.GetProperty("Items") != null; return hasKeyProp && hasItemsProp; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 获取Key和Items属性的值 var keyValue = value.GetType().GetProperty("Key").GetValue(value)?.ToString(); var itemsValue = value.GetType().GetProperty("Items").GetValue(value); // 手动构建目标JSON结构 writer.WriteStartObject(); writer.WritePropertyName(keyValue); serializer.Serialize(writer, itemsValue); writer.WriteEndObject(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 若不需要反序列化,直接抛出异常即可 throw new NotImplementedException("暂不支持反序列化"); } }
步骤2:使用转换器序列化对象
针对匿名类的用法
直接在序列化时将转换器加入配置:
string keyValue = "keyValue1"; var itemsArray = new[] { new { Id = 1, Name = "Item1" }, new { Id = 2, Name = "Item2" } }; var anonymousObj = new { Key = keyValue, Items = itemsArray }; var jsonSettings = new JsonSerializerSettings { Converters = { new KeyItemsConverter() }, Formatting = Formatting.Indented // 可选,格式化输出 }; string targetJson = JsonConvert.SerializeObject(anonymousObj, jsonSettings);
针对普通类的用法
如果替换为普通类,可以直接给类添加[JsonConverter]特性,无需每次序列化都配置:
[JsonConverter(typeof(KeyItemsConverter))] public class KeyItemsModel { public string Key { get; set; } public object[] Items { get; set; } // 可根据实际需求改为泛型数组/集合 } // 序列化示例 var model = new KeyItemsModel { Key = "keyValue1", Items = new[] { new { Id = 1, Name = "Item1" }, new { Id = 2, Name = "Item2" } } }; string targetJson = JsonConvert.SerializeObject(model, Formatting.Indented);
最终输出结果
两种方式都会得到你需要的JSON格式:
{ "keyValue1": [ { "Id": 1, "Name": "Item1" }, { "Id": 2, "Name": "Item2" } ] }
内容的提问来源于stack exchange,提问作者dododo
相关产品推荐
相关产品推荐

