[英]How deserialize plain String to Json using Jackson in Java?
我有一個簡單的類作為法師的屬性:
// getter/setter omitted for brevity
public class Magic() {
String Spell;
int strength;
}
public class Mage() {
String name;
Magic magic;
}
我需要從 2 個不同的源字符串反序列化 JSON:
{
"name" : "Sauron",
"magic" : {
"spell" : "Tamador",
"strenght" : 10
}
}
和
{
"name" : "Gandalf",
"magic" : "You shall not pass"
}
甚至“你不能通過” -> 魔法物體
我認為使用@JsonDeserialize(using = MagicDeserializer.class)
將是使用 Jackson 的方式,但 Parser 會使用“無法識別的令牌”。 有沒有辦法可以攔截加載進行自己的解析?
自定義反序列化器的想法是正確的,您可以擴展StdDeserializer
類並在其deserialize
化方法中將 json 轉換為JsonNode
,將與 json 中的magic
鍵關聯的兩個String
和Object
不同的值分開:
public class MagicDeserializer extends StdDeserializer<Magic> {
public MagicDeserializer() {
super(Magic.class);
}
@Override
public Magic deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
final ObjectCodec codec = jp.getCodec();
JsonNode root = codec.readTree(jp);
Magic magic = new Magic();
if (root.isTextual()) { //<- magic is a string
magic.setSpell(root.textValue());
return magic;
}
//ok, so magic is an Magic object
return codec.treeToValue(root, Magic.class);
}
}
然后,如果您注釋您的Magic
字段,您可以反序列化兩個 json:
@Data
public class Mage {
private String name;
@JsonDeserialize(using = MagicDeserializer.class)
private Magic magic;
}
@Data
public class Magic {
private String Spell;
private int strength;
}
Mage sauron = mapper.readValue(json1, Mage.class);
System.out.println(mapper.writeValueAsString(sauron));
Mage gandalf = mapper.readValue(json2, Mage.class);
System.out.println(mapper.writeValueAsString(gandalf));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.