System.Text.Json反序列化含正则字符串时反斜杠丢失,如何解决?
解决System.Text.Json反序列化正则字符串时反斜杠丢失的问题
这本质是JSON转义规则的问题——在JSON规范里,\/是正斜杠的转义写法,反序列化时会被自动解析成普通的/,不是System.Text.Json的异常行为。要保留正则里的反斜杠,分两种情况处理:
情况1:你可以控制JSON的生成
要让反序列化后保留\/,需要在JSON里把反斜杠双重转义,也就是写成\\/。修改后的示例JSON如下:
{ "urlPattern": "^\\/api\\/v1\\/something\\/(.*some-user-id.*)" }
这样反序列化后就能得到带反斜杠的正则字符串:^\/api\/v1\/something\/(.*some-user-id.*)
情况2:JSON是外部传入的,无法修改内容
可以自定义一个JsonConverter跳过默认的转义解析,直接读取原始字符串:
using System; using System.Text.Json; using System.Text.Json.Serialization; public class RawStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.GetString() ?? string.Empty; } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(value); } }
反序列化时添加这个转换器即可:
var options = new JsonSerializerOptions(); options.Converters.Add(new RawStringConverter()); var result = JsonSerializer.Deserialize<YourModel>(jsonString, options);
另外提醒:如果正则里还有其他转义字符(比如\d、\w),同样要在JSON里写成\\d、\\w,否则反序列化后反斜杠也会丢失。
内容的提问来源于stack exchange,提问作者MobileDev
相关产品推荐
相关产品推荐

