如何解决反序列化含正则表达式令牌的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
相关产品推荐
相关产品推荐

