超全模态模型 × Harness 升级,升级解锁 ArkClaw,最新支持 DeepSeek-V4 系列与 GLM-5.1
这个问题本质是双重序列化搞的鬼:你前端发的是强类型List<Document>,但后端用List<object>接收时,序列化框架(不管是Newtonsoft.Json还是System.Text.Json)会先把每个Document对象序列化成JSON字符串,再把这个字符串作为List<object>的元素再次序列化,最终就出现了{{"id":"1", "name":"Doc1"}}这种嵌套格式——外层的引号和转义是把字符串转成JSON的结果,内层才是你原本的对象JSON。
List<Document>
List<object>
Document
{{"id":"1", "name":"Doc1"}}
下面分两种情况给你解决方案:
这是最优解,优先推荐:
方案1:用JSON原生类型接收 放弃List<object>,改用对应序列化框架的原生JSON类型列表来接收:
List<JsonElement> docs
List<JObject> docs
JObject
item["id"]
方案2:调整前端发送的对象类型 如果后端必须用List<object>接收,前端发送时不要直接传强类型Document列表,改成传匿名对象或者Dictionary<string, object>列表:
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对象,而非字符串,自然不会有多余大括号。
[{"id":"1","name":"Doc1"}]
如果前端无法修改,只能处理后端接收到的嵌套格式,可以通过字符串处理+反序列化来提取原始对象:
foreach (var item in docs) { // 先将object转为字符串,去掉前后的引号,再还原转义的双引号 var rawJson = item.ToString().Trim('"').Replace("\\\"", "\""); // 反序列化为目标Document类型 var doc = JsonConvert.DeserializeObject<Document>(rawJson); // 后续处理doc... }
foreach (var item in docs) { var rawJson = item.ToString().Trim('"').Replace("\\\"", "\""); var doc = JsonSerializer.Deserialize<Document>(rawJson); // 后续处理doc... }
注意:不同序列化框架的转义逻辑可能略有差异,你可以先打印item.ToString()的实际内容,再调整字符串处理的细节,确保拿到正确的原始JSON字符串。
item.ToString()
内容的提问来源于stack exchange,提问作者Junilo
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起
模型再升级,30秒超长叙事, 模态参考扩容
模型自由,工具不限,最新支持 Deepseek-V4 系列、GLM-5.3 系列
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列
大模型19元起,Al应用9.9元畅享,新人首购爆款尽享优惠