在春季编写JSON反序列化程序或扩展它的正确方法
2022-08-31 15:38:42
我正在尝试在春季编写自定义JSON反序列化程序。我想对大部分字段使用默认序列化程序,并对几个属性使用自定义反序列化程序。可能吗?我正在尝试这种方式,因为大多数属性都是值,因此对于这些,我可以让Jackson使用默认的反序列化程序;但是很少有属性是引用,因此在自定义反序列化程序中,我必须查询数据库以获取引用名称并从数据库获取引用值。
如果需要,我将展示一些代码。
我正在尝试在春季编写自定义JSON反序列化程序。我想对大部分字段使用默认序列化程序,并对几个属性使用自定义反序列化程序。可能吗?我正在尝试这种方式,因为大多数属性都是值,因此对于这些,我可以让Jackson使用默认的反序列化程序;但是很少有属性是引用,因此在自定义反序列化程序中,我必须查询数据库以获取引用名称并从数据库获取引用值。
如果需要,我将展示一些代码。
我已经搜索了很多,到目前为止,我发现的最好的方法是在这篇文章上:
要序列化的类
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。
我试图将Spring管理的服务纳入我的.有人在调用序列化程序/反序列化程序时使用运算符向我提示 Jackson。这意味着没有自动连接杰克逊的实例。以下是我如何能够将我的服务类变成我的:@Autowire
Deserializer
new
Deserializer
@Autowire
Deserializer
上下文.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
锚点深度解析器.java
public class AnchorDeserializer extends JsonDeserializer<Anchor> {
@Autowired
private AnchorService anchorService;
public Anchor deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
// Do stuff
}
}
锚点服务.java
@Service
public class AnchorService {}
更新:虽然我写这篇文章时我原来的答案对我有用,但@xi.lin的回应正是我需要的。很好找!