Java Jackson序列化器获取变量名称

时间:2016-03-31 18:09:45

标签: java json serialization reflection jackson

我有类似的类结构:

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();
    }
}

但我不确定如何获取变量名称。我是以正确的方式来做这件事的吗?如果是这样,我如何获得变量名称?

2 个答案:

答案 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方法,您将拥有变量名称。

我希望我能帮到你!