为什么杰克逊在转换为 json 时将字节数组转换为 base64 字符串?
Why does jackson convert byte array to base64 string on converting to json?
当我在 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);
}
}
我希望杰克逊将其转换为整数数组,如下所示:
{
"binaryFile" : [21, 45, 12, 65, 12 ,37, etc]
}
但是,我发现它被转换为 base64 字符串。
{
"binaryFile" : "ZXhhbXBsZSB0ZXh0IG9ubHkuIEJpbmFyeSBmaWxlIHdhcyBkaWZmZXJlbnQgTE9MLg=="
}
研究了一下,似乎json 不支持here 提到的字节数组。这是有道理的,因为 json 是数据的字符串表示形式。
但是我还是找不到为什么json不支持字节数组的答案?它仍然只是一个数字数组,对吗?将其转换为 base64 编码的字符串需要什么?将字节数组作为数字数组传递给 json 字符串有什么问题?
对于那些将其标记为基于意见的问题:
开发人员肯定不会想到“将字节作为数字数组传递很无聊。让我们尝试一些看起来很疯狂的编码字符串”。这背后一定有一些道理。
What is wrong in passing byte array as is to the json String as an array of numbers?
没什么,如果您对输入的每个字节(平均而言,假设字节分布均匀)3.57 个字符感到满意。这是假设您 不 每个逗号后有一个 space - 否则它是 4.57 个字符。
因此将这些数据大小与 10K 数据进行比较:
- 原始:10240字节(不能直接在JSON中表示)
- Base64: 13656 个字符
- 数字数组:36556 个字符
base64 的大小增加 33% 已经够痛苦了……使用数组的大小增加要糟糕得多。所以约定是改用base64。 (这只是一个约定 - 它并没有融入 JSON 规范。但大多数 JSON 编码器和解码器都遵循它。)
当我在 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);
}
}
我希望杰克逊将其转换为整数数组,如下所示:
{
"binaryFile" : [21, 45, 12, 65, 12 ,37, etc]
}
但是,我发现它被转换为 base64 字符串。
{
"binaryFile" : "ZXhhbXBsZSB0ZXh0IG9ubHkuIEJpbmFyeSBmaWxlIHdhcyBkaWZmZXJlbnQgTE9MLg=="
}
研究了一下,似乎json 不支持here 提到的字节数组。这是有道理的,因为 json 是数据的字符串表示形式。
但是我还是找不到为什么json不支持字节数组的答案?它仍然只是一个数字数组,对吗?将其转换为 base64 编码的字符串需要什么?将字节数组作为数字数组传递给 json 字符串有什么问题?
对于那些将其标记为基于意见的问题:
开发人员肯定不会想到“将字节作为数字数组传递很无聊。让我们尝试一些看起来很疯狂的编码字符串”。这背后一定有一些道理。
What is wrong in passing byte array as is to the json String as an array of numbers?
没什么,如果您对输入的每个字节(平均而言,假设字节分布均匀)3.57 个字符感到满意。这是假设您 不 每个逗号后有一个 space - 否则它是 4.57 个字符。
因此将这些数据大小与 10K 数据进行比较:
- 原始:10240字节(不能直接在JSON中表示)
- Base64: 13656 个字符
- 数字数组:36556 个字符
base64 的大小增加 33% 已经够痛苦了……使用数组的大小增加要糟糕得多。所以约定是改用base64。 (这只是一个约定 - 它并没有融入 JSON 规范。但大多数 JSON 编码器和解码器都遵循它。)