2016-03-31 3 views
0

У меня есть структура класса, как так:Java Джексон сериализатору захватить имя переменной

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

Но я не уверен, как получить имя переменной. Правильно ли я это делаю? Если да, как мне получить имя переменной?

ответ

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

Я не мог найти способ, чтобы написать вложенный объект, не давая узлу имя, может быть, вы можете найти путь. В любом случае, дайте мне знать, нужна ли какая-либо помощь, чтобы настроить это на ваши нужды.

0

Я считаю, что вы сьютами это:

// GET variables of Foo 
Field[] fields= value.getClass().getDeclaredFields(); 

for(Field f : fields){ 
    String fieldName = f.getName()); 
} 

Используя метод GetName, вы будете иметь свое имя переменные.

Надеюсь, я помог вам!

Смежные вопросы