如何在 Java 中使用 Jackson 将纯字符串反序列化为 Json?
How deserialize plain String to Json using Jackson in Java?
我有一个简单的class作为属性的法师:
// 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 的方式,但是解析器会吐出“无法识别的标记”。有什么方法可以拦截加载来进行我自己的解析吗?
自定义反序列化器的想法是正确的,您可以扩展 StdDeserializer
class 并在其 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
字段你可以反序列化两个 jsons:
@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));
我有一个简单的class作为属性的法师:
// 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 的方式,但是解析器会吐出“无法识别的标记”。有什么方法可以拦截加载来进行我自己的解析吗?
自定义反序列化器的想法是正确的,您可以扩展 StdDeserializer
class 并在其 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
字段你可以反序列化两个 jsons:
@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));