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

如何解决反序列化含正则表达式令牌的JSON时转义字符识别报错问题

问题解决方案

根因说明

你遇到的报错本质是JSON语法规范限制:JSON标准只支持\n、\t、\"、\\等固定转义序列,\w不属于JSON合法转义符,因此输入的包含单个反斜杠加w的JSON本身不符合规范,Newtonsoft.Json默认会按照标准JSON规则校验,自然会抛出解析错误。

最优方案(符合开发规范)

如果可以控制JSON的生成源头,直接在生成JSON时将正则中的反斜杠做二次转义即可:例如把正则里的\w转为\\w,\d转为\\d,以此类推。这种方式不需要修改任何反序列化逻辑,也完全符合JSON标准,是生产环境的首选方案。

兜底方案(无法修改JSON生成逻辑时使用)

如果拿到的就是不符合规范的原始JSON,不需要重写RegexConverter,用更简单的两种方式处理即可:

方式1:预处理JSON字符串

通过正则替换,把所有非JSON标准转义前缀的单个反斜杠替换为双反斜杠,再执行反序列化:

// 匹配所有不属于JSON合法转义序列前缀的反斜杠,替换为双反斜杠
var processedJson = Regex.Replace(typeJson, @"\\(?![""\\/bfnrtu])", @"\\");
typeSettings = JsonConvert.DeserializeObject<Dictionary<string,string>>(processedJson) ?? new Dictionary<string,string>();

方式2:自定义字符串转换器

实现一个简单的JsonConverter,读取字符串时直接取原始值,不做转义解析:

public class RawStringConverter : JsonConverter<string>
{
    public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        return reader.TokenType == JsonToken.String ? reader.Value.ToString() : null;
    }

    public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
    {
        writer.WriteValue(value);
    }
}

调用时传入转换器即可:

typeSettings = JsonConvert.DeserializeObject<Dictionary<string,string>>(typeJson, new JsonConverter[] { new RawStringConverter() }) ?? new Dictionary<string,string>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 08:54:03