gson 如何从带有编码base64图像的Json文件中获取byte []

smtd7mpg  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(194)

我有一个包含JSON结构化数据的文件,其中一个属性是Base64编码的图像。我使用POJOMap到Java对象,并将上述图像属性指定为String类型。(尝试了byte[],但无法创建Java对象,因此我使用了String。)
现在,我必须使用属性类型为byte[]的JPA实体将其保存到数据库中。
实体:

@Lob
private byte[] profilePic;

日期:

private String profilePic;

问题

dto.getProfilePic().getBytes()

getBytes("utf-8")

正在更改映像,映像已损坏。映像从iVBORw0KGgoAAAANSUhEUgAAB.....更改为
89504E470D0A1A0A0000000D4948445200....

**注意:**内容在JSON格式的文件中

是否可以使用任何其他JSON库从文件序列化到byte[]?使用的库是Gson。

Gson gson = new Gson(); 
StagingDTO[] infoArray = gson.fromJson(reader, StagingDTO[].class);

或者从文件中获取byte[]的任何方法?

kuuvgm7e

kuuvgm7e1#

您可以使用java.util.Base64.decode()。此方法获取一个Base64字符串并返回byte[]。最后您应该保存byte[]。

js4nwp54

js4nwp542#

tl;dr:使用Base64.Decoder类别。

一个简单的工作示例:

final String REDDOT_png  = "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTM0A1t6AAAAI0lEQVQYV23HsQkAAAjAsP7/tC7SoQhZwvDr1atXr169+gMLKP8/wbwli7QAAAAASUVORK5CYII=";
    byte[] binaryContent = Base64.getDecoder().decode(REDDOT_png);
    Files.write(Paths.get("test.png"), binaryContent);
    System.err.println("Wrote file to: "+Paths.get("test.png").toAbsolutePath());

在您的示例中,只需将decode()调用中的REDDOT_png交换为DTO的getProfilePic()方法,并删除其他三行。

你为什么要面对这个问题

问题在于,您正在String类的Object上调用getBytes()方法。getBytes()方法实际上执行以下操作(源代码):
使用平台的默认字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。
例如:

byte[] test = "a".getBytes();
    System.err.println(test[0]);

写:97,它是“a”的Ascii / UTF-8 / UTF-16...表示。
但是,您并不想将base64 String的二进制表示形式持久化到数据库中,您实际上需要的是解码后的base64 String,它只是文件的二进制内容。

q7solyqu

q7solyqu3#

我从gson切换到Jackson,它工作正常

try (FileReader reader = new FileReader(tempFile)){

//Gson gson = new Gson(); 
//List<MyDTO> qDTOs = gson.fromJson(reader, new TypeReference<List<MyDTO>>(){});
 List<MyDTO> qDTOs = objectMapper.readValue(reader, new TypeReference<List<MyDTO>>(){});

My DTO has

private byte[] profilepic;

相关问题