代码之家  ›  专栏  ›  技术社区  ›  ip696

json jackson不带setter反序列化对象

  •  0
  • ip696  · 技术社区  · 6 年前

    我有课(例如。在实际项目中,我使用jaxb生成的类代替用户):

    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)
    

    因为用户没有setter。如何反序列化?

    2 回复  |  直到 6 年前
        1
  •  0
  •   GolamMazid Sajib    6 年前

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

    试试这个:

    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;
        }
    
        2
  •  0
  •   user8372096user8372096    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>