嵌套JSON字符串反序列化问题:处理未知源转义ASCII数据
解决方案:用两次JSON反序列化替代手动转义
别用手动替换转义字符的方式,这种方法覆盖不全还容易出错。正确的做法是利用JSON序列化器的原生能力,分两步处理:
还原嵌套的JSON字符串
你拿到的Order.OrderState是被JSON序列化过一次的字符串(原始JSON被当作字符串嵌入父JSON,所有特殊字符都被转义)。直接用JSON序列化器把它反序列化为普通字符串,就能自动处理所有转义规则(包括引号、换行、特殊符号等),得到原始的JSON内容。清理换行并反序列化为目标类
还原完成后,把JSON字符串中的换行符替换为空格(匹配你的目标格式),再反序列化为OrderState类。
代码示例(System.Text.Json)
// 第一步:还原嵌套的JSON字符串,自动处理所有转义 string rawJson = JsonSerializer.Deserialize<string>(Order.OrderState); // 第二步:替换所有换行符为空格(兼容Windows和Unix换行) string cleanedJson = rawJson.Replace("\n", " ").Replace("\r", ""); // 第三步:反序列化为自定义OrderState类 OrderState orderState = JsonSerializer.Deserialize<OrderState>(cleanedJson);
代码示例(Newtonsoft.Json)
如果使用Newtonsoft.Json,逻辑完全一致:
string rawJson = JsonConvert.DeserializeObject<string>(Order.OrderState); string cleanedJson = rawJson.Replace("\n", " ").Replace("\r", ""); OrderState orderState = JsonConvert.DeserializeObject<OrderState>(cleanedJson);
为什么手动替换不可行?
JSON的转义规则包含多种场景:除了你提到的双引号和+,还有制表符\t、回车\r、斜杠\/、Unicode转义\uXXXX等。手动替换永远无法覆盖所有未知的转义情况,而JSON序列化器本身就是为处理这些规则设计的,能确保还原出正确的原始JSON结构。
内容的提问来源于stack exchange,提问作者Vereonix
相关产品推荐
相关产品推荐

