说我有课Foo
public class Foo {
private Bar bar;
}
和Bar
public class Bar {
private String fizz;
private String bang;
}
编辑:为了澄清,我不拥有Foo
和Bar
,也不能改变这些类。
如果我想序列化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 } }"
答案 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
内的JSON
为Bar
。
由于您无法更改这些类,因此您只需检查Foo
中的null
是Bar 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
希望这有帮助。