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
相关产品推荐
相关产品推荐

