杰克逊:如果属性为null,则将属性反序列化为另一个属性

时间:2017-10-23 13:19:38

标签: java jackson deserialization

我想将一个属性反序列化为另一个属性,如果它为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对象中。

2 个答案:

答案 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;
    }
}

抱歉可能有不正确的缩进。

相关问题