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

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>对象做序列化,可以通过自定义转换器实现结构强制转换:

  1. 首先实现自定义序列化转换器
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();
    }
}
  1. 序列化时指定转换器即可
string json = JsonConvert.SerializeObject(someClss(), Formatting.Indented, new SomeClassOneListConverter());

Console.WriteLine(json);
Console.ReadLine();

说明

你的需求属于序列化根结构整体转换,ContractResolver主要用于控制属性的序列化规则(比如忽略属性、修改属性名等),不适合处理此类结构转换场景,因此不推荐用ContractResolver实现。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:57:01