为了账号安全,请及时绑定邮箱和手机立即绑定

Json Jackson 在没有 setter 的情况下反序列化对象

Json Jackson 在没有 setter 的情况下反序列化对象

大话西游666 2021-07-09 14:07:32
我有类(例如。在实际项目中,我有 JAXB 生成的类而不是用户):public class User {  private List<String> users;  public List<String> getUsers() {    return users;  }}当我获得用户用户(带有数据)时,我可以使用 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)因为 User 没有 setter。我怎样才能反序列化它?
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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


试试这个:


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;

    }


查看完整回答
反对 回复 2021-07-14
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

如果您更喜欢在创建 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>


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 546 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信