繁体   English   中英

使用 Jackson 将嵌套的 Json 记录从 Postgres 反序列化到 POJO

[英]Deserialize Nested Json Record From Postgres To POJO using Jackson

我是 Jackson 的新手,当它变得复杂到我面临的问题时,它是如何真正工作的。 我有一条来自数据库的记录,它存储为 JSON TYPE(使用 postgres)。 下面是它在数据库中的示例: {"flutterwave": {"secret": "SECRET KEYS"}, "dlocal": {"xkey": X KEY VALUE", "xlogin": "X LOGIN VALUE"}}

来自 python 世界,我会刚刚完成json.loads(DATA_FROM_DB_IN_JSON)并自动将生成的 output 转换为字典,我可以在其中轻松检索和使用我想要的键,但是使用 Jackson 库 883748959,能够让它工作。

下面是我在 java 中所做的,但没有按照我预期的方式工作,如果是 python。

public class PaymentConfigDTO {

    @JsonAlias({"secrets"})
    @JsonDeserialize(using = KeepAsJsonDeserializer.class)
    private String processorCredentials;
}

解串器 CLASS

public class KeepAsJsonDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {
        TreeNode tree = jsonParser.getCodec().readTree(jsonParser);
        return tree.toString();
    }
}

总而言之,我想要实现的是能够将来自数据库的结果 json 转换为可反序列化为 Map<String, Map<>> 或更好的方法,在这种方法中我将能够在没有太大压力的情况下获取嵌套值。

如果你想得到一个Map<String, Map<String, String>>你可以这样做:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
...
var mapper = new ObjectMapper();
var result = mapper.readValue(json, new TypeReference<Map<String, Map<String, String>>>() {});

但最好使用类型:

record Config(Flutterwave flutterwave, DLocal dlocal) {}
record Flutterwave(String secret) {}
record DLocal(String xkey, String xlogin) {}
...
var mapper = new ObjectMapper();
var result = mapper.readValue(json, Config.class);
var secret = result.flutterwave().secret()

假设您已经拥有 Json String,将其反序列化为 Map<String, Object> 非常简单。 您不需要编写自己的解串器 class。您需要做的就是:

ObjectMapper om = new ObjectMapper();
try {
  Map<String, Object> map = om.readValue(jsonStr, Map.class);
} catch(IOException ioe) {
...
}

请参阅ObjectMapper的 JavaDoc
另外,如果你想要它更简单,我写了我自己的 JsonUtil,你甚至不必实例化 ObjectMapper。 您的代码如下所示:

 try {
    Map<String, Object> map = JsonUtils.readObjectFromJsonString(jsonStr, Map.class);
} catch (IOException ioe) {
    ...
}

在此示例中,class JsonUtils附带由我编写和维护的开源 MgntUtils 库。 请参阅JsonUtils class 的 Javadoc MgntUtils 库可以作为 Maven 工件从Maven Central获得,或者连同源代码和 Javadoc 从 Github 获得

所以我所做的基本上是更新自定义解串器 class 以使用 JsonNode 而不是 TreeNode

它被重写为:

@Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);
        return node.get("value").textValue();
    }

然后转换为 map,我做了Map<String, Object> toMap = objectMapper.readValue(JSON, Map.class)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM