在Spring中编写JSON解串器或者扩展它的正确方法

我正在尝试在Spring中编写一个自定义的JSON解串器。 我想为大部分字段使用默认的序列化器,并为less数属性使用自定义的反序列化器。 可能吗? 我正在尝试这种方式,因为属性的大部分都是值,所以对于这些我可以让jackson使用默认的反序列化器; 但很less有属性是引用,所以在自定义反序列化器中,我必须查询数据库的引用名称并从数据库中获取引用值。

如果需要,我会显示一些代码。

我search了很多,到目前为止我发现的最好的方法就是这篇文章 :

要序列化的类

package net.sghill.example; import net.sghill.example.UserDeserializer import net.sghill.example.UserSerializer import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; @JsonDeserialize(using = UserDeserializer.class) public class User { private ObjectId id; private String username; private String password; public User(ObjectId id, String username, String password) { this.id = id; this.username = username; this.password = password; } public ObjectId getId() { return id; } public String getUsername() { return username; } public String getPassword() { return password; } } 

反序列化器类

 package net.sghill.example; import net.sghill.example.User; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.ObjectCodec; import org.codehaus.jackson.map.DeserializationContext; import org.codehaus.jackson.map.JsonDeserializer; import java.io.IOException; public class UserDeserializer extends JsonDeserializer<User> { @Override public User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); return new User(null, node.get("username").getTextValue(), node.get("password").getTextValue()); } } 

编辑:另外,你可以看看这篇文章使用新版本的com.fasterxml.jackson.databind.JsonDeserializer。

我试图@Autowire一个spring托pipe服务到我的Deserializer 。 当调用序列化器/解串器时,有人使用new操作符将我引向Jackson。 这意味着我的Deserializer的jackson的实例没有自动布线。 这是我能够@Autowire我的服务类到我的Deserializer

的context.xml

 <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" ref="objectMapper" /> </bean> </mvc:message-converters> </mvc> <bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <!-- Add deserializers that require autowiring --> <property name="deserializersByType"> <map key-type="java.lang.Class"> <entry key="com.acme.Anchor"> <bean class="com.acme.AnchorDeserializer" /> </entry> </map> </property> </bean> 

现在我的Deserializer是一个Springpipe理的bean,自动连线工作!

AnchorDeserializer.java

 public class AnchorDeserializer extends JsonDeserializer<Anchor> { @Autowired private AnchorService anchorService; public Anchor deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException { // Do stuff } } 

AnchorService.java

 @Service public class AnchorService {} 

更新 :当我写这篇文章的时候,我的原始答案对我有用,@ xi.lin的回答正是我需要的。 很好找!

使用Spring MVC 4.2.1.RELEASE,您需要使用下面的新的Jackson2依赖关系来parsing器工作。

不要使用这个

 <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.12</version> </dependency> 

改用这个。

 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.2.2</version> </dependency> 

也可以使用com.fasterxml.jackson.databind.JsonDeserializer和com.fasterxml.jackson.databind.annotation.JsonDeserialize进行反序列化,而不要使用org.codehaus.jackson中的类