You need to enable JavaScript to run this app. Json.NET序列化时如何为生成的数组添加指定顶层键名封装
优惠活动
大模型
产品
解决方案
定价
更多

Json.NET序列化时如何为生成的数组添加指定顶层键名封装

Newtonsoft.Json序列化数组添加顶层指定键的实现

问题说明

当前直接序列化List<GeometricShapes>会输出无外层包装的裸数组:

[
  {
    "circle": "1",
    "triangle": "2",
    "square": "3"
  },
  {
    "circle": "1",
    "triangle": "2",
    "square": "3"
  }
]

需要实现的目标格式为:

{"geometricShapes":[{"circle": "1","triangle": "2","square": "3"},{"circle": "1","triangle": "2","square": "3"}]}

实现方案

核心逻辑是给数组外层增加一个包含目标键名的包装对象,再执行序列化,有两种可选实现:

  • 方案1:匿名对象包装(轻量,无需额外定义类)
    直接在序列化入参处构造匿名对象,把列表绑定到目标键名下,修改后的核心代码如下:
    // 修正原代码中单引号的语法错误,C#字符串需用双引号包裹
    string jsonString = "{\"circle\": \"1\",\"triangle\": \"2\",\"square\": \"3\"}";
    Model.GeometricShapes geometricShapes = JsonConvert.DeserializeObject<GeometricShapes>(jsonString);
    List<GeometricShapes> geometricShapesList = new List<GeometricShapes>();
    geometricShapesList.Add(geometricShapes);
    geometricShapesList.Add(geometricShapes);
    
    // 仅需修改序列化的入参为匿名对象,指定键名geometricShapes
    string jsonStringUpdated = JsonConvert.SerializeObject(
        new { geometricShapes = geometricShapesList },
        Formatting.Indented
    );
    Console.WriteLine(jsonStringUpdated);
    
  • 方案2:自定义包装实体类(适合复用场景)
    如果该结构需要在多个位置使用,可以定义专用的响应类:
    public class GeometricShapesEnvelope
    {
        public List<GeometricShapes> geometricShapes { get; set; }
    }
    
    序列化时实例化该类后再执行序列化即可:
    var envelope = new GeometricShapesEnvelope
    {
        geometricShapes = geometricShapesList
    };
    string jsonStringUpdated = JsonConvert.SerializeObject(envelope, Formatting.Indented);
    

注意:原代码中jsonString使用单引号包裹的写法不符合C#语法,需改为双引号并转义内部的双引号。

内容的提问来源于stack exchange,提问作者david-so

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 10:06:04