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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:57:29