簡體   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