java - 从 json 字符串反序列化字节数组

标签 java json jackson

我有带有字节数组和 json 字符串字段的 Dto,使用 JSON.stringify 和服务进行序列化,应该解析该字符串。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CompanyDto {

    private UUID id;
    private String name;
    private boolean isVerified;
    private String description;
    private byte[] fileData;
    private UUID accountId;
}
    @Override
    public CompanyDto parseCompanyDto(String s) {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new Hibernate5Module());
        try {
            return objectMapper.readValue(s, CompanyDto.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return null;
        }
    }

如果输入字符串中的 fileData 为空,则该服务运行良好,但它无法从在前端序列化的字符串中反序列化字节数组。它失败并出现异常:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `[B` out of START_OBJECT token
 at [Source: (String)"{"name":"testCompany","description":"test test test","fileData":{"0":255,"1":216,"2":255,"3":224,"4":0,"5":16,"6":74,"7":70,"8":73,"9":70,"10":0,"11":1,"12":1,"13":2,"14":0,"15":56,"16":0,"17":56,"18":0,"19":0,"20":255,"21":219,"22":0,"23":67,"24":0,"25":2,"26":2,"27":2,"28":2,"29":2,"30":1,"31":2,"32":2,"33":2,"34":2,"35":3,"36":2,"37":2,"38":3,"39":3,"40":6,"41":4,"42":3,"43":3,"44":3,"45":3,"46":7,"47":5,"48":5,"49":4,"50":6,"51":8,"52":7,"53":9,"54":8,"55":8,"56":7,"57":8,"58":8,"59":9,"60":"[truncated 25008 chars]; line: 1, column: 65] (through reference chain: edu.netcracker.jobdealer.dto.CompanyDto["fileData"])
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1442)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1216)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1126)
    at com.fasterxml.jackson.databind.deser.std.PrimitiveArrayDeserializers.handleNonArray(PrimitiveArrayDeserializers.java:240)
    at com.fasterxml.jackson.databind.deser.std.PrimitiveArrayDeserializers$ByteDeser.deserialize(PrimitiveArrayDeserializers.java:498)
    at com.fasterxml.jackson.databind.deser.std.PrimitiveArrayDeserializers$ByteDeser.deserialize(PrimitiveArrayDeserializers.java:446)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)
    at service.impl.JsonServiceImpl.parseCompanyDto(JsonServiceImpl.java:51)

我尝试使用 URlSearchParams.append 单独发送 fileData,效果很好,但听起来像是一个肮脏的黑客行为。

你能说一下[B实例的含义以及如何正确解析它吗?

最佳答案

Java 无法序列化字节数组。使用base64或者您可以实现自己的序列化器/反序列化器

关于java - 从 json 字符串反序列化字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134495/

相关文章:

java - 让 JSON Post 在 Spring Boot 中工作

c# - 在C#中反序列化JSON数据的好方法

java - 如何获取 JavaFX 菜单的父菜单栏

java - Tic Tac Toe 游戏 - 数组没有保存值(value)?

java - 如何将 Jena Fuseki 服务器连接到像 MySQL 这样的 Netbeans

java - 分数计算器

python - 如何使用 Flask 提供 HTML 和 JSON 内容?

java - 关于JSON解析

jakarta-ee - 如何在 JAX-RS 应用程序 (WebSphere Liberty) 中更改 Jackson 版本

java - 使用 Jackson 反序列化数组 JSON 时出错