Java Jackson序列化器获取变量名称 [英] Java Jackson serializer grab variable name

查看:822
本文介绍了Java Jackson序列化器获取变量名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的类结构:

public class Foo {
    private Foo2 title;
    private Foo2 message;
}

public class Foo2 {
    private String value;
    private String variable;
}

当我将这些类序列化为json时,我想输出以下json:

When I serialize these classes into json I want to output the following json:

{
    "type": "title",
    "value": "...",
    "variable": "..."
},
{
    "type": "message",
    "value": "...",
    "variable": "..."
}

我做了一个自定义序列化程序类如下:

I made a custom serializer class like so:

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

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

But I'm not sure how to get the variable name. Am I going about this the right way? If so, how do I get the variable name?

推荐答案

我实现了一个可能的解决方案,我认为可能会实现您的目标或者至少指向你自己。

I implemented a possible solution that I think may achieve what you are looking for or at least point you towards your own.

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"
    }
}

I在没有给节点命名的情况下找不到编写嵌套对象的方法,也许你可以找到一种方法。在任何情况下,请告诉我是否需要任何帮助来根据您的需要进行调整。

I could not find a way to write a nested object without giving the node a name, maybe you can find a way. In any case let me know if any help is needed tweaking this to your needs.

这篇关于Java Jackson序列化器获取变量名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆