我有一个json像:
{
"names": "John, Tom",
"values": "8, 9",
"statuses": "yes, no"
}
字符串
并希望实现以下目标:
class Bean {
private List<String> names;
private List<Integer> values;
private List<StatusEnum> statuses;
}
型
我知道单独实现StringToStringListDeserializer
、StringToIntegerListDeserializer
和StringToStatusEnumListDeserializer
是可行的。但是还有很多其他的内容类型,包括自定义类型。我试过:
public class StringToListDeserializer<T> extends JsonDeserializer<List<T>> implements ContextualDeserializer
public List<T> deserialize(JsonParser p, DeserializationContext context) throws IOException {
JavaType javaType = property.getType();
if (p.hasToken(JsonToken.VALUE_STRING)) {
String text = p.getText();
if (StringUtils.isBlank(text)) {
return null;
}
List<T> list = new LinkedList<>();
JavaType contentType = javaType.getContentType();
JsonDeserializer<Object> deserializer = context.findNonContextualValueDeserializer(contentType);
for (String s : text.split(DELIMITER)) {
// todo how to deserialize the string to a known type?
}
return list;
}
return context.readValue(p, javaType);
}
型
我不知道如何将字符串转换为已知的内容类型。有没有办法实现一个通用的转换器?
3条答案
按热度按时间q7solyqu1#
为了避免手动的格式化和处理所有可能的类型,我们可以使用一个事实,即列表中的所有元素都是
JSON
元素,当我们用引号("
)char Package 它们时。因此,我们可以将
John, Tom
转换为"John", "Tom"
,将8, 9
转换为"8", "9"
等等。我们可以使用默认的
Jackson
行为,它允许处理意外的令牌。在我们的例子中,每当:STRING
令牌出现时,JSON ARRAY
是预期的。为了处理这些情况,我们可以使用com.fasterxml.jackson.databind.deser.DeserializationProblemHandler
类。它可能看起来像下面这样:字符串
示例用法:
型
以上应用程序适用于您的
JSON
有效载荷打印:型
我使用Lombok和Guava库只是为了使它简单和简短,但它们并不是强制性的。
vshtjzan2#
我也遇到了这个问题。我完成了你的代码中的TODO。
字符串
xmd2e60i3#
您的Bean没有正确表示JSON。正确的版本应该如下所示
字符串
可以使用Object Mapper
型
最后,您可以将Bean对象分解为名称、值和状态的列表,以便进一步使用。