【问题标题】:Custom JSON to POJO mapper自定义 JSON 到 POJO 映射器
【发布时间】:2021-05-28 13:39:34
【问题描述】:

上下文

我正在尝试使用 RestTemplate GET 请求接收数据,服务器以 JSON 格式返回我需要的数据,响应包含我需要的所有数据,但它也包含大量多余的数据并且我不想要将包含过多数据的过多字段添加到我的 POJO 以自动映射它。

问题是

我可以制作一个自定义映射器,仅将某些 JSON 字段映射到我的 java 类吗?希望有任何帮助

一些代码示例

以前我像这样将 JSON 直接映射到我的 POJO:

ResponseEntity<Foo> response = new RestTemplate(requestFactory)
            .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<Foo>(){});

但现在我使用的服务改变了它的 API 并以完全不同的格式发送数据。更改我的 java 类真的很不愉快,所以我想知道我是否可以只映射需要的数据

我得到的 json 看起来像这样:

[{
    "idReadable": "idR",
    "customFields": [{
        "projectCustomField": {
            "field": {
                "name": "Name",
                "$type": "type"
            },
            "$type": "type"
        },
        "value": {
            "name": "Value",
            "$type": "type"
        },
        "$type": "type"
    }],
    "id": "id",
    "$type": "type"
}]

我只需要两个“名称”值

解决方案

正如@mostneededrabbit 在 cmets 中建议的那样,解决方案是为内部的 RestTemplate 编写自定义 Deserializer 扩展 StdDeserializer,如下所示:

    ArrayNode nodeList = jp.getCodec().readTree(jp);
    HashMap<String, String> fields = new HashMap<>();
    List<Issue> foos = new ArrayList<>();

    for (JsonNode node : nodeList) {
        String id = node.get("id").asText();
        issues.add(new Foo(id));
    }

要真正让它工作,你需要在发送请求之前做这样的事情:

    var mapper = new ObjectMapper();
    var module = new SimpleModule();
    module.addDeserializer(Foo.class, new FooDeserializer());
    mapper.registerModule(module);

    var converter = new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(mapper);
    var restTemplate = new RestTemplate(requestFactory);
    restTemplate.getMessageConverters().add(0, converter);

【问题讨论】:

    标签: java json resttemplate pojo


    【解决方案1】:

    您可以通过将其放在您的班级顶部来忽略不需要的字段:

    @JsonIgnoreProperties(ignoreUnknown = true)
    

    然后只保留类中需要的字段。

    【讨论】:

    • 由于复杂的响应嵌套系统,我不确定是否可以通过注释执行此操作,但无论哪种方式,我都很好奇是否有办法实现某种类型的映射器?
    • 添加了我正在尝试转换的 json,也许这将有助于更好地理解任务
    • @mmmetafool​​ 遍历 JSON 是您正在寻找的解决方案类型吗?还是更“开箱即用”的东西?
    • 如果我不必多次处理响应,我想遍历是很好的,如果我可以在我在 RestTemplate 获取数据的同时处理它,那就太好了。我可以配置我自己的反序列化器吗?
    • @mmmetafool​​ 也许这会有所帮助 - baeldung.com/jackson-deserialization
    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2016-10-20
    • 2017-03-04
    相关资源
    最近更新 更多