我是靠谱客的博主 天真手机,最近开发中收集的这篇文章主要介绍Java 使用Jackson处理json 字符串值反序列化类型为集合时的报错处理 单个值自动转集合,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
在处理Json字符串时 有时会遇到一种情况:
JSON字符串中的某一项的值是字符串类型,但想要反序列化为一个集合类型
举例: {"i":1,"list":"astr","str":"em"} 这样一个字符串 想要反序列化为如下的一个类 可以预见的在转换到list时会抛出如下异常
public class Po {
private Integer i;
private List<String> list;
private String str;
}
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'XXX': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
jackson在发现目标类型是list 但当前字符没有[ 这样的集合开始标志 就会抛出转换失败异常。
解决办法就是在使用之前 为objectMapper增加一项自定义的错误处理器,并在处理这个错误时将list 实例化,将对应的值加入该list
代码:
/**
* 当json字符串中值为string类型 并无[]符号,且要反序列化为list时 使用该配置解决报错
*
* @author heasy
**/
public class MyDeserializationProblemHandler extends DeserializationProblemHandler {
@Override
public Object handleUnexpectedToken(DeserializationContext ctxt, JavaType targetType, JsonToken token, JsonParser parser, String failureMsg) throws IOException {
//处理json字符串 转 目标为数组 元素为字符串的情况
if (token == JsonToken.VALUE_STRING && targetType.isCollectionLikeType()) {
return deserializeString(targetType, parser);
}
//处理单个json对象 转 目标为数组 且元素为对象的情况
if (token == JsonToken.START_OBJECT && targetType.isCollectionLikeType()) {
return deserializeObject(targetType, parser);
}
return super.handleUnexpectedToken(ctxt, targetType, token, parser, failureMsg);
}
private Object deserializeObject(JavaType targetType, JsonParser parser) throws IOException {
List<Object> list = new ArrayList<>(1);
final Class<?> rawClass = targetType.getContentType().getRawClass();
final Object o = ReflectUtil.newInstanceIfPossible(rawClass);
while (parser.getCurrentToken() != JsonToken.END_OBJECT) {
if (parser.getText().equals(JsonToken.START_OBJECT.asString())) {
parser.nextToken();
continue;
}
String field = parser.getText();
parser.nextToken();
String value = parser.getText();
if (ReflectUtil.hasField(rawClass, field)) {
ReflectUtil.setFieldValue(o, field, value);
}
parser.nextToken();
}
list.add(o);
return list;
}
private Object deserializeString(JavaType listType, JsonParser parser) throws IOException {
String[] values = parser.getText().split(",");
JavaType itemType = listType.getContentType();
List<Object> result = new ArrayList<>(values.length);
for (String value : values) {
final String json = """ + value.trim() + """;
final Object o = JsonUtil.fromJson(json, itemType);
result.add(o);
}
return result;
}
}
除了简单字符串转list,还可以处理object的json 转object对应list 这里用到了反射,工具类使用的是hutool的。如果不需要去掉对应判断即可
然后将这个错误处理器配置到你使用的objectmapper中即可
objectMapper.addHandler(new MyDeserializationProblemHandler());
最后
以上就是天真手机为你收集整理的Java 使用Jackson处理json 字符串值反序列化类型为集合时的报错处理 单个值自动转集合的全部内容,希望文章能够帮你解决Java 使用Jackson处理json 字符串值反序列化类型为集合时的报错处理 单个值自动转集合所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复