【问题标题】:Java Jackson serializer grab variable nameJava Jackson 序列化程序抓取变量名
【发布时间】:2016-03-31 18:09:45
【问题描述】:

我有一个这样的类结构:

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

但我不确定如何获取变量名。我会以正确的方式解决这个问题吗?如果是这样,我如何获得变量名?

【问题讨论】:

    标签: java json serialization reflection jackson


    【解决方案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"
        }
    }
    

    如果不给节点命名,我找不到编写嵌套对象的方法,也许你能找到一种方法。无论如何,让我知道是否需要任何帮助来根据您的需要进行调整。

    【讨论】:

      【解决方案2】:

      我相信你正在寻找这个:

      // GET variables of Foo
      Field[] fields= value.getClass().getDeclaredFields();
      
      for(Field f : fields){
          String fieldName = f.getName());
      }
      

      使用 getName 方法,您将获得变量名称。

      希望对你有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 2023-03-04
        • 2018-08-14
        • 1970-01-01
        相关资源
        最近更新 更多