Jackson Mapper序列化空对象而不是null

时间:2017-01-16 23:23:50

标签: java json serialization jackson

说我有课Foo

public class Foo {
    private Bar bar;
}

和Bar

public class Bar {
    private String fizz;
    private String bang;
}

编辑:为了澄清,我不拥有FooBar,也不能改变这些类。

如果我想序列化Foo类型的空对象,它的类型为Bar的成员将返回null。

String json = objectMapper.writeValueAsString(new Foo()); // "{"bar" : null}"

有没有什么方法可以让对象映射器序列化一个空的Bar对象而不必实例化一个新的Bar实例然后将它添加到一个新的Foo实例?

String json = objectMapper.writeValueAsString(new Foo()) // "{bar": {"fizz" : null, "bang" : null } }"

3 个答案:

答案 0 :(得分:2)

还要求我提供这种结构以实现旧客户端兼容性,这是我的解决方案(取决于Spring Boot,因为使用@JsonComponent注释)

创建将被视为空的“特殊对象”

public class EmptyObject {
}

在模型中创建属性

@JsonProperty("data")
private EmptyObject data = new EmptyObject();

public EmptyObject getData() {
    return data;
}

创建将处理上方空对象的序列化器

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.sevensenders.datahub.api.service.response.model.EmptyObject;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;

@JsonComponent
public class EmptyObjectSerializer extends StdSerializer<EmptyObject> {

    public EmptyObjectSerializer() {
        this(null);
    }

    public EmptyObjectSerializer(Class<EmptyObject> t) {
        super(t);
    }

    @Override
    public void serialize(EmptyObject value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        // to maintain AF compatible format it is required to write {} instead of null
        gen.writeStartObject();
        gen.writeEndObject();
    }
}

输出:

{
  ...
  "data": {}
}

答案 1 :(得分:1)

您可以创建自定义序列化程序来序列化Foo对象。然后在您的自定义FooSerializer实现中,您可以检查空值栏并将其序列化为默认的Bar实例。有关如何创建自定义序列化程序的一些示例,请参阅https://spin.atomicobject.com/2016/07/01/custom-serializer-jackson/http://www.baeldung.com/jackson-custom-serialization

答案 2 :(得分:0)

没有。我没有看到任何这样做的方式。如果您未初始化Bar,则null内的JSONBar

由于您无法更改这些类,因此您只需检查Foo中的nullBar bar = foo.getBar(); if (bar == null) { foo.setBar(new Bar()); } String json = objectMapper.writeValueAsString(foo); 是否为json,如果是,则只需初始化它即可#39} ;得到你想要的。

{
    "bar" : {
        "fizz" : null, 
        "bang" : null 
    } 
}

#!/bin/bash # Filvariabel cd /medianas/html fil="/medianas/html/extra.flt" logfil="/medianas/html/fltlog/extra.flt.hist" originalfil="/medianas/html/fltlog/extra.flt.orig" pocfil="/medianas/html/pocsaglog.flt" pocbak="/medianas/html/fltlog/pocsaglog.bak.flt" [[ -f pocsaglog.flt ]] && sed -i 's/nr :.[0-9][0-9][0-9][0-9][0-9][0- 9][0-9]//' ${pocfil} # Replace Pos: with X= [[ -f ${fil} ]] && sed -i 's/Pos: /X=/g' ${fil} # Replace ,_ followed by 7 numbers, with Y= [[ -f ${fil} ]] && sed -i 's/\(, \)\([0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)/ Y=\2/g' ${fil} # Add NN to numbers in id [[ -f ${fil} ]] && sed -i 's/\(Mapp Id : \)\([0-9][0-9][0-9][0-9][0- 9][0-9][0-9]\)/NN\2/g' ${fil} [[ -f ${fil} ]] && sed -i 's/\(nr : \)\([0-9][0-9][0-9][0-9][0-9][0- 9][0-9]\)//g' ${fil} [[ -f $fil ]] && cat $fil >> $originalfil # Deletes empty rows if [ -f ${fil} ] then grep -v '^\s*$' ${fil} > ${fil}.test # Delete linefeeds tr '\r\n' ' ' < $fil.test > $fil.labb # Deletes all spaces and replace with one space tr -s " " < ${fil}.labb > ${fil}.test [[ -f ${fil}.test ]] && sed -i '/F*rlarm/d' ${fil}.test # Take away Änr: and seven numbers sed -i 's/?nr:.[0-9][0-9][0-9][0-9][0-9][0-9][0-9]//' ${fil}.test # Make blank line before pocnr sed -i 's/\ [0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\n&/g' ${fil}.test # Delete tmpfiles and original [[ -f ${fil} ]] && rm ${fil} # Delete space where line starts with it. sed -i 's/^ *//' ${fil}.test [[ -f $fil.test ]] && cat $fil.test >> $logfil # [[ -f ${fil}.test ]] && rm ${fil}.test fi 将是以下内容:

.headbg

希望这有帮助。