C#序列化嵌套列表为指定无方括号JSON格式的问题
现有尝试的代码
定义的类结构
public class Fields { public string Name { get; internal set; } public Field myField { get; internal set; } public class Field { public string Value { get; internal set; } public string Key { get; internal set; } public Field(string value, string key) { Value = value; Key = key; } } public Fields(string name, Field myField) { Name = name; this.myField = myField; } }
初始化逻辑
List<Fields> myFields = new List<Fields>(); foreach (var field in recipient.Fields) { myFields.Add(new Fields(field, new Fields.Field(name, value))); } document.Fields = myFields;
当前错误输出
"fields": [ { "Name": "name1", "myField": { "key1": "value1", "key2": "value2" } }, { "Name": "name2", "myField": { "key3": "value3", "key4": "value4" } } ]
需要修正的问题:
- 移除
fields外层的方括号(将数组改为对象) - 将固定键名
myField替换为动态的name1、name2等值 - 采用规范的序列化方式,避免手动拼接字符串
解决方案
核心是用**字典(Dictionary)**存储fields,字典序列化后会直接生成键值对对象,完美匹配目标JSON结构。
1. 定义字段内容类(或用动态字典)
如果子对象的键是固定的(如key1、key2),定义类:
public class FieldItem { public string key1 { get; set; } public string key2 { get; set; } // 根据API需求添加更多属性 }
如果子对象的键是动态不固定的,直接用Dictionary<string, string>代替类即可。
2. 修改Document类的Fields属性类型
将Document类中的Fields改为字典类型:
public class Document { // 固定子对象结构用这个 public Dictionary<string, FieldItem> Fields { get; set; } // 动态子对象结构用这个 // public Dictionary<string, Dictionary<string, string>> Fields { get; set; } }
3. 初始化并序列化
// 初始化字典 var fieldsDict = new Dictionary<string, FieldItem>(); foreach (var field in recipient.Fields) { // 假设field.Name是name1、name2,field对应的值为value1、value2 fieldsDict.Add(field.Name, new FieldItem { key1 = field.Value1, key2 = field.Value2 }); // 动态子对象的写法: // fieldsDict.Add(field.Name, new Dictionary<string, string> // { // { "key1", field.Value1 }, // { "key2", field.Value2 } // }); } // 赋值给Document对象 var document = new Document { Fields = fieldsDict }; // 序列化生成JSON string resultJson = JsonConvert.SerializeObject(document, Formatting.Indented);
最终生成的JSON
执行后会得到符合要求的结构:
{ "fields": { "name1": { "key1": "value1", "key2": "value2" }, "name2": { "key3": "value3", "key4": "value4" } } }
原理说明
JSON中的{ "name1": {...}, "name2": {...} }本质是键值对集合,C#的Dictionary<TKey, TValue>序列化后会直接映射为这种结构;而之前用List会被序列化为数组(带方括号),这就是输出不符合要求的核心原因。
内容的提问来源于stack exchange,提问作者tbeest
相关产品推荐
相关产品推荐

