簡體   English   中英

如何編寫自定義的Jackson解串器,將包含原始json的json對象反序列化為單個對象?

[英]How do I write a custom Jackson deserializer to deserialize a json object that contains raw json into a single object?

我想使用Jackson(> 2.0)庫將來自我無法控制的后端的數據反序列化為單個對象,該對象包含包裝程序的ID以及原始JSON字符串中的所有數據,包裝中包含。 我如何編寫自定義的Jackson解串器來創建Movie的新對象而不定義包裝類?

數據:

{
  "id": "1",
  "rawMovieData": "{\"name\": \"Office Space\", \"director\": \"Mike Judge\"}"
}

數據模型:

case class Movie(id: String, name: String, director: String)

我當前的解串器如下所示:

class MovieDeserializer extends JsonDeserializer[Movie] {
    override def deserialize(jp: JsonParser, ctxt: DeserializationContext): Movie {
        val wrapper: JsonNode = jp.getCodec.readValue(jp)
        val id: String = wrapper.get("id").asInstanceOf[TextNode].textValue
        val rawMovie: String = wrapper.get("rawMovieData").asInstanceOf[TextNode].textValue
        //How do I now deserialize rawMovie?

        Movie(id, name, director)
    }
}

注意:我的問題定義為Scala,但我認為Java方法足夠相似,沒關系。 因此,用Java回答是可以接受的。

使用JAXB。 它代表用於XML綁定的Java API,位於javax.xml.bind包中。

您將需要Eclipse MOXy提供程序作為依賴項。 如果您正在執行Java EE編程,那么它已經為您服務。

這是實現:

@XmlRootElement
@XmlAccessorType(FIELD)
public class Movie {

    @XmlElement
    private int id;

    @XmlElement
    private String rawMovieData;

    public Movie() {
        // must have a default constructor if you define a non-default
    }

}

接下來,在這里看看如何真正進行解組。

我找到了答案! 必須創建另一個解析器來解析原始json。

class MovieDeserializer extends JsonDeserializer[Movie] {
    override def deserialize(jp: JsonParser, ctxt: DeserializationContext): Movie {
        val wrapper: JsonNode = jp.getCodec.readValue(jp)
        val id: String = wrapper.get("id").asInstanceOf[TextNode].textValue
        val rawMovie: String = wrapper.get("rawMovieData").textValue

        //Create a new parser to parse the raw json string
        val rawMovieParser: JsonParser = jp.getCodec.getFactory.createParser(rawMovie)
        val movieNode: JsonNode = rawMovieParser.getCodec.readValue(rawMovieParser)
        val name: String = movieNode.get("name").textValue
        val director: String = movieNode.get("director").textValue

        Movie(id, name, director)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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