ASP.NET Core 5中JSON响应与输入的字符串编码不一致问题
为什么ASP.NET Core API返回的JSON字符串作为输入后,C#中字符串不相等但JavaScript中相等?
这本质是JSON序列化/反序列化的转义规则和不同编程语言对字符串字面量的解析逻辑差异导致的,咱们一步步拆解:
1. 先看JSON里的转义细节
你API返回的JSON响应里的字符串是:
"h24KFS69\\pucBJH3x2ov+MAj\/JWq/UBt3EjhKGUtBM="
这里的转义要按JSON规则理解:
\\在JSON中代表单个反斜杠\(因为JSON用\做转义符,所以要表示真实的\必须写两个)\/是JSON里的可选转义——JSON规范允许把/转写成\/,但两者在语义上完全等价,反序列化时都会被解析为单个/
当你把这个JSON作为输入传给API时,ASP.NET Core默认的JSON反序列化器(System.Text.Json)会严格按JSON规则解析:把\\转成\,把\/转成/,所以最终myClassInput.Str的实际值是:
"h24KFS69\\pucBJH3x2ov+MAj/JWq/UBt3EjhKGUtBM="
(注意MAj后面是单个/,没有前面的\)
2. 再看你C#代码里的原始字符串
你在API中创建的obj.Str是C#字符串字面量:
"h24KFS69\\pucBJH3x2ov+MAj\\/JWq/UBt3EjhKGUtBM="
C#里的字符串字面量转义规则是:\\代表单个\,所以这段代码实际存储的字符串是:
"h24KFS69\pucBJH3x2ov+MAj\/JWq/UBt3EjhKGUtBM="
(这里MAj后面是\+/两个字符,不是单个/)
这就导致了myClassInput.Str和obj.Str的实际内容不一样,自然比较结果为false。
3. 为什么JavaScript里比较是true?
JavaScript的字符串字面量解析规则里,\/会被直接解析为单个/——和你直接写/没有区别。所以不管你写:
"h24KFS69\pucBJH3x2ov+MAj\/JWq/UBt3EjhKGUtBM="
还是:
"h24KFS69\pucBJH3x2ov+MAj/JWq/UBt3EjhKGUtBM="
JS解析后得到的都是完全相同的字符串,所以全等比较===会返回true。
怎么解决?
根据你的需求选择两种方案:
- 如果你希望输入和输出的字符串逻辑等价:修改C#中
obj.Str的定义,把\\/改成/,也就是:
这样反序列化后的输入字符串就和var obj = new MyApiClass { Str = "h24KFS69\\pucBJH3x2ov+MAj/JWq/UBt3EjhKGUtBM=" };obj.Str完全一致了。 - 如果你确实需要保留
\/这个字符组合:那你在输入JSON时需要把\/转义成\\\\/(因为JSON里要表示\需要写\\,所以\+/就要写成\\\/),也就是输入JSON应该是:
这样反序列化后{ "str": "h24KFS69\\\\pucBJH3x2ov+MAj\\/JWq/UBt3EjhKGUtBM=" }myClassInput.Str就会和obj.Str相等。
内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch
相关产品推荐
相关产品推荐

