【问题标题】:Why does jackson convert byte array to base64 string on converting to json?为什么杰克逊在转换为json时将字节数组转换为base64字符串?
【发布时间】:2021-07-13 08:21:26
【问题描述】:

当我在 DTO 中有一个字节数组并使用杰克逊的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不支持here中提到的字节数组。这是有道理的,因为 json 是数据的字符串表示形式。

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

对于那些将其标记为基于意见的问题:

开发人员绝对不会想到“将字节作为数字数组传递很无聊。让我们尝试一些看起来很疯狂的编码字符串”。这背后一定有一些理由。

【问题讨论】:

  • 可能有很多原因,但我能想到的一个是尺寸。作为一个数字,每个字节需要 1-3 个字符 + 逗号,并且在反序列化它时,杰克逊对于每个 int 至少需要 4 个字节,直到可以将它们转换为字节数组。因此,您需要多 2-4 倍的内存,而使用 Base64 您只需要大约 1.33 倍的内存。
  • 我不认为寻求技术解释来理解为什么事情会以它们的方式工作是基于意见的问题。
  • JSON 支持字节数组就好了(好吧,技术上是整数数组),所以前提是错误的;以这种方式发送字节数组通常没有意义。
  • 来吧伙计们。这不是我的编辑中解释的基于意见的问题。请投票支持重新开放。

标签: java json jackson fasterxml


【解决方案1】:

将字节数组作为数字数组传递给 json 字符串有什么问题?

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

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

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

base64 的大小增加 33% 已经够痛苦了……使用数组的大小增加要糟糕得多。所以约定是改用base64。 (这只是一种约定——它不像 JSON 规范中的内容。但大多数 JSON 编码器和解码器都遵循它。)

【讨论】:

  • 一个后续问题。对于传输单个二进制文件,有什么理由应该首选 json 而不是将字节资源作为application/octet-stream 发送?
  • @ArunGowda:这是一个完全不同的问题 - 非常不是 Stack Overflow cmets 的用途。
猜你喜欢
  • 2017-10-03
  • 2017-12-03
  • 1970-01-01
  • 2012-11-15
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多