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

如何使用JsonConvert将C#匿名对象列表转换为JSON字符串?

解决List中匿名对象的Json.NET序列化问题

我懂你遇到的问题——用Json.NET序列化存放在List<object>里的匿名对象时,大概率会得到空对象或者不完整的JSON,对吧?这其实是C#匿名类型的特性导致的,咱们一步步解决:

问题根源

C#的匿名类型是编译器自动生成的internal密封类,它的属性也是internal访问级别。当你把这些匿名对象塞进List<object>后,Json.NET默认的契约解析器只会查找public成员,根本识别不到这些internal属性,自然序列化不出正确内容。

解决方案1:避免使用List(推荐)

如果不需要依赖List<object>的泛型特性,直接用var声明集合,让编译器自动推断匿名类型的实际类型,Json.NET能直接正确处理:

// 用数组或编译器推断类型的集合存储匿名对象
var collection = new[] 
{ 
    new { 
        FirstSetting = new { 
            FirstKEy = "Property vs Inspections", 
            color = "#FF6384", 
            fontStyle = "Arial", 
            sidePadding = 10 
        } 
    }, 
    new { 
        AnotherSettings = new { 
            text = "another text", 
            color = "#FF6384", 
            fontStyle = "Arial", 
            sidePadding = 10 
        } 
    } 
};

// 直接序列化,无需额外配置
string json = JsonConvert.SerializeObject(collection, Formatting.Indented);

这种方式最省心,编译器会帮你匹配匿名类型的真实结构,Json.NET能直接识别所有属性,生成完整的JSON。

解决方案2:必须用List时的配置

如果业务场景要求必须使用List<object>,那我们需要修改Json.NET的序列化设置,让它能识别internal成员:

// 配置序列化规则,允许访问非公共成员
var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver
    {
        // 设置成员搜索标志,包含public和non-public(internal属于non-public)
        DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
        // 可选:如果需要驼峰命名,保留此设置;不需要则删除
        NamingStrategy = new CamelCaseNamingStrategy()
    },
    Formatting = Formatting.Indented // 可选,格式化输出方便查看
};

var collection = new List<object>() 
{ 
    new { 
        FirstSetting = new { 
            FirstKEy = "Property vs Inspections", 
            color = "#FF6384", 
            fontStyle = "Arial", 
            sidePadding = 10 
        } 
    }, 
    new { 
        AnotherSettings = new { 
            text = "another text", 
            color = "#FF6384", 
            fontStyle = "Arial", 
            sidePadding = 10 
        } 
    } 
};

string json = JsonConvert.SerializeObject(collection, settings);

这段代码通过DefaultContractResolver修改了成员搜索规则,让Json.NET可以读取匿名类型的internal属性,从而生成正确的JSON。

验证结果

不管用哪种方案,最终生成的JSON应该是这样的(格式化后):

[
  {
    "FirstSetting": {
      "FirstKEy": "Property vs Inspections",
      "color": "#FF6384",
      "fontStyle": "Arial",
      "sidePadding": 10
    }
  },
  {
    "AnotherSettings": {
      "text": "another text",
      "color": "#FF6384",
      "fontStyle": "Arial",
      "sidePadding": 10
    }
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:33:08