簡體   English   中英

如何在 Java 中使用 Jackson 將純字符串反序列化為 Json?

[英]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鍵關聯的兩個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字段,您可以反序列化兩個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM