【发布时间】: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