Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写自定义Jackson反序列化程序将包含原始json的json对象反序列化为单个对象?_Java_Json_Scala_Jackson_Deserialization - Fatal编程技术网

Java 如何编写自定义Jackson反序列化程序将包含原始json的json对象反序列化为单个对象?

Java 如何编写自定义Jackson反序列化程序将包含原始json的json对象反序列化为单个对象?,java,json,scala,jackson,deserialization,Java,Json,Scala,Jackson,Deserialization,使用Jackson(>2.0)库,我想将来自后端的数据反序列化为一个包含包装器id的对象,以及包装器中包含的原始JSON字符串中的所有数据。如何编写自定义Jackson反序列化程序来创建Movie的新对象,而不定义包装器类 数据: { "id": "1", "rawMovieData": "{\"name\": \"Office Space\", \"director\": \"Mike Judge\"}" } 数据模型: case class Movie(id: String, na

使用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中 包裹

您将需要EclipseMoxy提供程序作为依赖项。如果您正在进行JavaEE编程,那么它已经为您准备好了

以下是实现:

@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)
    }
}

你真的能用JAXB来解压JSON吗?我整天都在这么做。您将需要EclipseMoxyJAXB提供程序,而这对于寻求(联合国)编组JSON的通用方法的人来说可能是一个很好的解决方案。这并没有解决我的问题的本质,这是针对杰克逊图书馆的。我在问题的主体部分已经把这一点讲得更清楚了。