为何C#与Java对同一内容生成的Base64编码结果不同?
问题原因及解决方案
核心差异:JSON序列化的斜杠转义行为不同
问题本质是两边JSON序列化时对斜杠/的处理规则不一致,导致生成的UTF-8字节数组不同,最终Base64编码结果出现差异:
- Java的
JSONObject(通常为org.json库)默认会将字符串中的斜杠/转义为\/,生成的JSON字符串为:{"partnerUrl":"https:\/\/test.com\/testapp\/abc\/signup"} - C#的
System.Text.Json.JsonSerializer默认不转义斜杠/,生成的JSON字符串为:{"partnerUrl":"https://test.com/testapp/abc/signup"}
这两个JSON语义完全等价(JSON规范允许斜杠转义或不转义),但对应的UTF-8字节数组存在差异,因此Base64编码结果自然不同。
让C#生成与Java一致的Base64编码
要让C#输出和Java相同的Base64结果,只需修改JsonSerializer的配置,强制开启斜杠转义:
using System.Text.Json; using System.Text.Encodings.Web; var data = new Dictionary<string, string> { {"partnerUrl", "https://test.com/testapp/abc/signup"} }; // 配置编码器,开启斜杠转义规则 var options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All, JavaScriptEncoder.DefaultSettings.AllowEscapedSlashes) }; string jsonString = JsonSerializer.Serialize(data, options); byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(jsonString); string base64Result = Convert.ToBase64String(utf8Bytes);
修改后生成的JSON字符串会包含转义后的斜杠,最终Base64编码结果将与Java端完全一致。
内容的提问来源于stack exchange,提问作者Fazla Elahi Md Jubayer
相关产品推荐
相关产品推荐

