我有类似的类结构:
public class Foo {
private Foo2 title;
private Foo2 message;
}
public class Foo2 {
private String value;
private String variable;
}
当我将这些类序列化为json时,我想输出以下json:
{
"type": "title",
"value": "...",
"variable": "..."
},
{
"type": "message",
"value": "...",
"variable": "..."
}
我制作了一个自定义序列化程序类:
public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(Foo value,
JsonGenerator gen,
SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("type", /* get variable name */);
gen.writeStringField("value", value.getValue());
gen.writeStringField("variable", value.getVariable());
gen.writeEndObject();
}
}
但我不确定如何获取变量名称。我是以正确的方式来做这件事的吗?如果是这样,我如何获得变量名称?
答案 0 :(得分:1)
我实施了一个可能的解决方案,我认为可以实现您的目标,或者至少指向您自己的方案。
public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(Foo value,
JsonGenerator gen,
SerializerProvider serializers) throws IOException {
gen.writeStartObject();
Field[] fields = value.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
Foo2 obj = (Foo2) field.get(value);
gen.writeFieldName(field.getName());
gen.writeStartObject();
gen.writeStringField("type", field.getName());
gen.writeStringField("value", obj.getValue());
gen.writeStringField("variable", obj.getVariable());
gen.writeEndObject();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
gen.writeEndObject();
}
}
测试用例:
public static void main(String[] args) throws JsonProcessingException {
Foo2 message = new Foo2("valueMessage", "variableMessage");
Foo2 title = new Foo2("valueTitle", "variableTitle");
Foo foo = new Foo(title, message);
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Foo.class, new FooSerializer());
mapper.registerModule(module);
String serialized = mapper.writeValueAsString(foo);
System.out.println(serialized);
}
输出JSON:
{
"message": {
"type": "message",
"value": "valueMessage",
"variable": "variableMessage"
},
"title": {
"type": "title",
"value": "valueTitle",
"variable": "variableTitle"
}
}
我找不到一种方法来编写嵌套对象而不给节点命名,也许你可以找到一种方法。在任何情况下,请告诉我是否需要任何帮助来根据您的需要进行调整。
答案 1 :(得分:0)
我相信你正在寻找这个:
// GET variables of Foo
Field[] fields= value.getClass().getDeclaredFields();
for(Field f : fields){
String fieldName = f.getName());
}
使用getName方法,您将拥有变量名称。
我希望我能帮到你!