Java 如何将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

考虑json输入:

{
    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;