杰森·杰克逊(Json Jackson)对对象进行反序列化而无需设置

时间:2018-08-13 10:47:28

标签: java jackson

我有类(例如,在实际项目中,我有JAXB生成的类而不是User):

public class User {
  private List<String> users;

  public List<String> getUsers() {
    return users;
  }
}

当我获得User用户(带有数据)时,可以使用JacksonJson将其序列化为String或byte []。但是,当我尝试将其反序列化为User时,会出现错误:

Cannot construct instance of `javax.xml.bind.JAXBElement` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

因为用户尚未设置。我如何反序列化?

2 个答案:

答案 0 :(得分:0)

您可以通过实现自定义反序列化器类来实现。

尝试一下:

String json = null;//your request json
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(User.class,new UserDeserialzer());
User user = objectMapper.registerModule(module).readValue(json,User.class);

反序列化器类:

public class UserDeserialzer extends JsonDeserializer<User>{
    @Override
    public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode value = new ObjectMapper().readTree(p.getText());
        User user = new User();
        try {
            Field field = user.getClass().getDeclaredField("users");
            field.setAccessible(true);
            field.set(user,value.get("users"));
        }catch (Exception ex){
        }
        return user;
    }
}

对于Spring-boot应用程序

添加此bean以全局反序列化。

@Bean
    public Jackson2ObjectMapperBuilder configureObjectMapper() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(User.class,new UserDeserialzer());
        objectMapper.registerModule(module);
        builder.configure(objectMapper);
        return builder;
    }

答案 1 :(得分:0)

如果在创建JAXB对象时更喜欢使用Apache CXF,则可以使用xjc插件在生成对象期间自动创建setter-getter方法。这样对您来说可能非常实用。

我遇到了相同的问题,因此我无需更改代码就解决了问题。

您可以将以下部分添加到pom文件中:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>${version.apache.cxf}</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${basedir}/src/main/java</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>${basedir}/src/main/resources/wsdl/sample.wsdl</wsdl>
                                <wsdlLocation>classpath:wsdl/sample.wsdl</wsdlLocation>
                                <extraargs>
                                    <extraarg>-xjc-Xbg</extraarg>
                                    <extraarg>-xjc-Xcollection-setter-injector</extraarg>
                                </extraargs>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.apache.cxf.xjcplugins</groupId>
                    <artifactId>cxf-xjc-boolean</artifactId>
                    <version>3.0.3</version>
                </dependency>
                <dependency>
                    <groupId>org.andromda.thirdparty.jaxb2_commons</groupId>
                    <artifactId>collection-setter-injector</artifactId>
                    <version>1.0</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>