java - 从json字符串反序列化字节数组
问题描述
我有带有字节数组和 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 为 null,则此服务运行良好,但它无法从字符串反序列化字节数组,在前端序列化。它以异常失败:
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 或者您可以实现自己的序列化器/反序列化器
推荐阅读
- javascript - 访问 Backbone 集合属性
- linux - 即使作为 root 用户也无法在 Fedora 中进行 yum 安装
- javascript - MongoDB/Express:为什么 Array.includes 返回 false 而不是 true?
- java - 没有命名 EntityManager 的持久性提供程序 - 我做错了什么?
- c - 用 contiki 测量时间(以时钟滴答为单位)
- php - 如何让 PhpStorm 了解 Doctrine 存储库的类型
- java - Spring Bean Factory 看不到类
- git - 为什么 GitHub “拉取请求审查” 中的批准按钮被禁用?
- java - Java VM 不能与 `android.util.*` 一起使用:可变类不能用非零值初始化
- c++ - 查找树中两个节点之间的最大成本边