当我在 DTO 中有一个字节数组并使用 Jackson 的 ObjectMapper
将其转换为 JSON 时,它会自动将字节数组转换为 Base64 字符串。以下是示例。
@Data
@AllArgsConstructor
class TestDTO {
private byte[] binaryFile;
}
class TestByteSerialization {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
byte[] bytes = Files.readAllBytes(new File("path/to/file/test.pdf").toPath());
TestDTO dto = new TestDTO(bytes);
String json = objectMapper.writeValueAsString(dto);
System.out.println(json);
}
}
我期望jackson能将其转换为以下的整数数组:
{
"binaryFile" : [21, 45, 12, 65, 12 ,37, etc]
}
但事实上,我发现它被转换为base64字符串了。
{
"binaryFile" : "ZXhhbXBsZSB0ZXh0IG9ubHkuIEJpbmFyeSBmaWxlIHdhcyBkaWZmZXJlbnQgTE9MLg=="
}
经过一番研究,似乎json不支持字节数组,如此所述。这是有道理的,因为json是数据的字符串表示形式。
但我仍然找不到答案:为什么json不支持字节数组?它仍然只是一个数字数组,将其作为一个数字数组传递给json字符串需要转换成base64编码的字符串吗?直接将字节数组传递给json字符串有何问题?
对于那些认为这是基于观点的问题的人:
开发人员肯定不会想到“将字节作为数字数组传递很无聊,让我们尝试一些看起来很疯狂的编码字符串”。这肯定有一些合理的原因。