Java 如何将json对象数组反序列化为json字符串数组?
考虑json输入:Java 如何将json对象数组反序列化为json字符串数组?,java,json,jackson,Java,Json,Jackson,考虑json输入: { companies: [ { "id": 1, "name": "name1" }, { "id": 1, "name": "name1" } ], nextPage: 2 } 如何将其反序列化到类中: public class MyClass { List<String&g
{
companies: [
{
"id": 1,
"name": "name1"
},
{
"id": 1,
"name": "name1"
}
],
nextPage: 2
}
如何将其反序列化到类中:
public class MyClass {
List<String> companies;
Integer nextPage;
}
@JsonRawValue
不适用于上市公司代码>
有没有一种方法可以将序列化配置为只保留带有注释的原始json字符串的公司数组?(例如,在不编写自定义反序列化程序的情况下)对于您的问题,没有唯一的注释解决方案。不知何故,您必须将JSON对象
转换为java.lang.String
,并且需要指定该转换
你可以:
编写自定义反序列化程序,这可能是最明显的解决方案,但在讨论中被禁止
注册自定义com.fasterxml.jackson.databind.deser.DeserializationProblemHandler
并以更复杂的方式处理com.fasterxml.jackson.databind.exc.MismatchedInputException
情况
实现com.fasterxml.jackson.databind.util.Converter
接口并将JsonNode
转换为String
。这是解决问题的半注释性方法,但我们没有实现最糟糕的部分——反序列化
让我们转到第二点。马上
2.反序列化问题处理程序
解决方案非常简单:
ObjectMapper mapper = new ObjectMapper();
mapper.addHandler(new DeserializationProblemHandler() {
@Override
public Object handleUnexpectedToken(DeserializationContext ctxt, JavaType targetType, JsonToken t, JsonParser p, String failureMsg) throws IOException {
if (targetType.getRawClass() == String.class) {
// read as tree and convert to String
return p.readValueAsTree().toString();
}
return super.handleUnexpectedToken(ctxt, targetType, t, p, failureMsg);
}
});
以TreeNode
的形式阅读一整段JSON
,并使用toString
方法将其转换为String
。有用的是,toString
生成有效的JSON
。缺点是,此解决方案对给定的ObjectMapper
实例具有全局作用域
3.自定义转换器
此解决方案需要实现com.fasterxml.jackson.databind.util.Converter
接口,该接口将com.fasterxml.jackson.databind.JsonNode
转换为String
:
class JsonNode2StringConverter implements Converter<JsonNode, String> {
@Override
public String convert(JsonNode value) {
return value.toString();
}
@Override
public JavaType getInputType(TypeFactory typeFactory) {
return typeFactory.constructType(new TypeReference<JsonNode>() {
});
}
@Override
public JavaType getOutputType(TypeFactory typeFactory) {
return typeFactory.constructType(new TypeReference<String>() {
});
}
}
类JsonNode2StringConverter实现转换器{
@凌驾
公共字符串转换(JsonNode值){
返回值.toString();
}
@凌驾
公共JavaType getInputType(类型工厂类型工厂){
返回typeFactory.constructType(新的TypeReference(){
});
}
@凌驾
公共JavaType getOutputType(类型工厂类型工厂){
返回typeFactory.constructType(新的TypeReference(){
});
}
}
现在,您可以使用如下注释:
@JsonDeserialize(contentConverter = JsonNode2StringConverter.class)
private List<String> companies;
@JsonDeserialize(contentConverter=JsonNode2StringConverter.class)
私人上市公司;
解决方案2。三,。解决这个问题的方法几乎相同——读取节点并将其转换回JSON
,但使用不同的方法
若要避免反序列化和序列化过程,可以查看本文提供的解决方案:并查看:
您解决了这个问题吗?我的回答有用吗?
@JsonDeserialize(contentConverter = JsonNode2StringConverter.class)
private List<String> companies;