Java 为什么jackson在转换为json时将字节数组转换为base64字符串?

Java 为什么jackson在转换为json时将字节数组转换为base64字符串?,java,json,jackson,fasterxml,Java,Json,Jackson,Fasterxml,当我在DTO中有一个字节数组并使用jackson的ObjectMapper将其转换为json时,它会自动将字节数组转换为base64字符串。下面的例子 @Data @AllArgsConstructor class TestDTO { private byte[] binaryFile; } class TestByteSerialization { public static void main(String[] args) throws Exception {

当我在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字符串。经过研究,json似乎不支持前面提到的字节数组

但是我仍然找不到json为什么不支持字节数组的答案?它仍然只是一个数字数组,对吗?将其转换为base64编码字符串需要什么?将字节数组按原样作为数字数组传递给json字符串有什么不对

将字节数组按原样作为数字数组传递给json字符串有什么不对

如果您对每个字节的输入(平均,假设字节分布均匀)3.57个字符感到满意,则什么都没有。假设每个逗号后面没有空格,否则是4.57个字符

因此,将这些数据大小与10K数据进行比较:

  • 原始:10240字节(不能直接用JSON表示)
  • Base64:13656个字符
  • 数字数组:36556个字符

base64尺寸增加33%已经够痛苦的了。。。使用数组的大小会增加很多很多。因此,惯例是使用base64。(这只是一个惯例——不像是被烘焙到JSON规范中。但大多数JSON编码器和解码器都遵循这个惯例。)

可能有很多原因,但我能想到的一个原因是大小。作为一个数字,每个字节需要1-3个字符+逗号,当反序列化它时,Jackson至少需要每个int的4个字节,直到这些字节可以转换为字节数组。因此,你需要2-4倍的内存,而Base64只需要1.33倍的内存。我不认为寻求技术解释来理解为什么事情会这样做是一个基于观点的问题。JSON支持字节数组很好(好的,技术上是一个整数数组),所以前提是错误的;这样发送字节数组通常是没有意义的。对于传输单个二进制文件,有什么理由认为json比以
application/octet-stream
的形式发送字节资源更受欢迎吗?@ArunGowda:这是一个完全不同的问题,而不是堆栈溢出注释的用途。