修正无效JSON字符串并转换为C#类 解决Newtonsoft反序列化异常问题
问题根源
你用到的原始JSON本身不符合标准JSON语法规范:标准JSON的外层对象{}内部必须是键:值结构,不能直接包裹数组[],这也是在线转换工具无法识别、反序列化直接报错的核心原因。你去掉外层大括号后JSON结构合法,所以代码可以正常运行。
你碰到的Newtonsoft.Json.JsonReaderException - Error reading string. Unexpected token报错,本质是解析器读取到首字符{时会判定当前是JSON对象,需要后续匹配键名:结构,结果下一个字符是[,不符合对象语法要求,在解析阶段就直接抛出异常,还没有执行到转换为实体类的步骤。
解决方案
分两种场景处理:
场景1:可调整数据源输出
直接要求数据源侧输出标准结构的JSON,即删除最外层多余的{},输出结构如下:
[ { "tmcp_post_fields": [], "product_id": 703, "per_product_pricing": true, "cpf_product_price": "45", "variation_id": false, "form_prefix": "", "tc_added_in_currency": "EUR", "tc_default_currency": "EUR" } ]
此时你原来定义的List<myclass>完全适配,反序列化代码直接使用即可:
return ja.ToObject<List<myclass>>();
场景2:无法修改数据源,必须兼容当前非法格式
先对原始JSON字符串做预处理,删除首尾多余的大括号后再做反序列化,示例代码如下:
// 预处理原始JSON字符串 string rawJson = "你拿到的原始JSON字符串"; string processedJson = rawJson.Trim(); if (processedJson.StartsWith("{[") && processedJson.EndsWith("]}")) { // 裁剪掉首尾多余的大括号 processedJson = processedJson.Substring(1, processedJson.Length - 2); } // 再执行反序列化 try { var result = JsonConvert.DeserializeObject<List<myclass>>(processedJson); return result; } catch (JsonException ex) { // 自行补充异常处理逻辑 return null; }
注:你定义的
myclass结构本身没有问题,如果后续确认tmcp_post_fields有固定的字段结构,可以把List<object>替换为对应的自定义类提升类型安全性。
内容的提问来源于stack exchange,提问作者Baumkuchen
相关产品推荐
相关产品推荐

