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

修正无效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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:39:03