[英]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.