我想将一个属性反序列化为另一个属性,如果它为null。
我们说我有一个班级:
nickname
每次login
为空时,我都希望将public String getNickname() {
return nickname == null ? login : nickname;
}
作为默认值返回。
问:是否有一般方法可以实现与杰克逊反序列化器的对比?
注意:有一种前进的方式,像这样的吸气剂将解决问题:
SELECT
(
SELECT
(
SELECT ol.Art_id AS ArtikelOrder
,(
SELECT
c.cl_id AS 'Client'
, c.name AS 'FirstName'
, c.surname AS 'SurName'
, c.DtOfBirth AS 'DateOfBirth'
from xml_clients AS c
join xml_orderlines AS x ON c.cl_id=x.cl_id
WHERE x.art_id = ol.art_id
FOR XML PATH('Buyer'), ROOT('Clients'),TYPE
)
,ol.DtOrder AS OrderDate
,ol.PlcOfOrder AS OrderPlace
,ol.orderid AS OrderId
FOR XML PATH('Tx'),ROOT('FirstRowRoot'),TYPE
)
FROM xml_OrderLines AS ol
FOR XML PATH(''),ROOT('Document'),TYPE
)
FOR XML PATH('FirstQRoot');
但它并不优雅,我也不想将任何逻辑放入我的DTO对象中。
答案 0 :(得分:0)
您可以自定义序列化
public class CustomFooSerialize extends JsonSerializer<Foo> {
@Override
public void serialize(Foo foo, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
if (foo.getNickname() == null) {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("nickname", foo.getLogin());
jsonGenerator.writeEndObject();
}
}
}
直接在类
上注册序列化器@JsonSerialize(using = CustomFooSerialize.class)
public class Foo
答案 1 :(得分:0)
在反序列化期间,jackson调用该类的setter。所以,我会尝试:
public void setNickname(String nickname) {
this.nickname == nickname;
if (nickname != null) {
login = nickname;
}
}
在这种情况下,属性登录可能需要@JsonIgnore。无论如何,这段代码令人困惑,因为setter有副作用。
返回解串器。在这种情况下,您需要编写自定义反序列化程序:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
//final Long id = node.get("id").asLong();
final String nickname = node.get("nickname").asText();
final String login = null;
if (nickname != null) {
login = nickname;
}
User user = new User();
user.setNickname(nickname);
user.setLogin(login);
return user;
}
}
抱歉可能有不正确的缩进。