C#序列化时如何提取List<Product>内容生成无外层包裹的目标JSON?
解决方案
提供两种可直接落地的实现方式,可根据你的业务场景选择:
方案1:序列化前提取目标数据(推荐)
该方案无需修改序列化规则,性能损耗最低,适合绝大多数无特殊限制的场景:
// 从原集合中提取所有SomeClassOne实例下的Products列表,合并为单一Product集合 var productList = someClss().SelectMany(x => x.Products).ToList(); // 直接序列化目标集合 string json = JsonConvert.SerializeObject(productList, Formatting.Indented); Console.WriteLine(json); Console.ReadLine();
方案2:自定义JsonConverter(适用于必须直接序列化List的场景)
如果业务逻辑限制你不能提前处理数据,必须直接对someClss()返回的List<SomeClassOne>对象做序列化,可以通过自定义转换器实现结构强制转换:
- 首先实现自定义序列化转换器
using Newtonsoft.Json; public class SomeClassOneListConverter : JsonConverter<List<SomeClassOne>> { public override void WriteJson(JsonWriter writer, List<SomeClassOne> value, JsonSerializer serializer) { // 直接提取所有Product对象序列化 var allProducts = value.SelectMany(item => item.Products).ToList(); serializer.Serialize(writer, allProducts); } public override List<SomeClassOne> ReadJson(JsonReader reader, Type objectType, List<SomeClassOne> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 如不需要反序列化可直接抛出异常,有反序列化需求可自行实现对应逻辑 throw new NotImplementedException(); } }
- 序列化时指定转换器即可
string json = JsonConvert.SerializeObject(someClss(), Formatting.Indented, new SomeClassOneListConverter()); Console.WriteLine(json); Console.ReadLine();
说明
你的需求属于序列化根结构整体转换,ContractResolver主要用于控制属性的序列化规则(比如忽略属性、修改属性名等),不适合处理此类结构转换场景,因此不推荐用ContractResolver实现。
内容的提问来源于stack exchange,提问作者Venkat Ramana
相关产品推荐
相关产品推荐

