如何在 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 键关联的两个 StringObject 不同的值分开:

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));