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

自定义类型反序列化为object时多余大括号问题及解决办法

解决List接收POST数据时对象被多余大括号包裹的问题

这个问题本质是双重序列化搞的鬼:你前端发的是强类型List<Document>,但后端用List<object>接收时,序列化框架(不管是Newtonsoft.Json还是System.Text.Json)会先把每个Document对象序列化成JSON字符串,再把这个字符串作为List<object>的元素再次序列化,最终就出现了{{"id":"1", "name":"Doc1"}}这种嵌套格式——外层的引号和转义是把字符串转成JSON的结果,内层才是你原本的对象JSON。

下面分两种情况给你解决方案:

一、从根源避免多余大括号

这是最优解,优先推荐:

  • 方案1:用JSON原生类型接收
    放弃List<object>,改用对应序列化框架的原生JSON类型列表来接收:

    • 如果用System.Text.Json,控制器参数写成List<JsonElement> docs
    • 如果用Newtonsoft.Json,参数写成List<JObject> docs
      这样框架会直接解析原始JSON结构,不会把对象当成字符串处理,拿到的每个元素都是可直接操作的JSON对象,既兼容所有自定义类型,又不会出现嵌套问题。比如用JObject的话,你可以直接通过item["id"]获取属性值,或者后续反序列化为具体的Document类型。
  • 方案2:调整前端发送的对象类型
    如果后端必须用List<object>接收,前端发送时不要直接传强类型Document列表,改成传匿名对象或者Dictionary<string, object>列表:

    // 用匿名对象
    var docs = new List<object>() { new { id = "1", name = "Doc1" } };
    // 或者用Dictionary
    var docs = new List<Dictionary<string, object>>() 
    { 
        new Dictionary<string, object> { {"id", "1"}, {"name", "Doc1"} } 
    };
    

    这样发送的JSON就是正常的[{"id":"1","name":"Doc1"}],后端List<object>接收时每个元素会被解析为JSON对象,而非字符串,自然不会有多余大括号。

二、无法避免时,手动去除多余大括号提取对象

如果前端无法修改,只能处理后端接收到的嵌套格式,可以通过字符串处理+反序列化来提取原始对象:

用Newtonsoft.Json的示例:

foreach (var item in docs)
{
    // 先将object转为字符串,去掉前后的引号,再还原转义的双引号
    var rawJson = item.ToString().Trim('"').Replace("\\\"", "\"");
    // 反序列化为目标Document类型
    var doc = JsonConvert.DeserializeObject<Document>(rawJson);
    // 后续处理doc...
}

用System.Text.Json的示例:

foreach (var item in docs)
{
    var rawJson = item.ToString().Trim('"').Replace("\\\"", "\"");
    var doc = JsonSerializer.Deserialize<Document>(rawJson);
    // 后续处理doc...
}

注意:不同序列化框架的转义逻辑可能略有差异,你可以先打印item.ToString()的实际内容,再调整字符串处理的细节,确保拿到正确的原始JSON字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:32:24