2016-04-15 4 views
1

У меня есть этот JSON десериализовать:Джексон Serialize поле для Different Имя

{ 
    "first-name": "Alpha", 
    "last-name": "Beta", 
    "gender": "m" 
} 

Я хочу сериализовать 2 различных форматов:

[A]

{ 
    "first-name": "Alpha", 
    "last-name": "Beta", 
    "gender": "m" 
} 

[B]

{ 
    "firstName": "Alpha", 
    "lastName": "Beta", 
    "gender": "m" 
} 

Я могу сериализовать его в формате 1: только [A] или [B]. Вот мой код сериализации его [B]:

public String firstName; 
public String lastName; 
public String gender; 

@JsonProperty("firstName") 
public String getFirstNameCC() { 
    return firstName; 
} 

@JsonProperty("first-name") 
public void setFirstNameD(String firstName) { 
    this.firstName = firstName; 
} 

@JsonProperty("lastName") 
public String getLastNameCC() { 
    return lastName; 
} 

@JsonProperty("last-name") 
public void setLastNameD(String lastName) { 
    this.lastName = lastName; 
} 

public String getGender() { 
    return gender; 
} 

public void setGender(String gender) { 
    this.gender = gender; 
} 

Я читал о JsonView здесь http://www.baeldung.com/jackson-json-view-annotation (раздел «5. Настройка JSON просмотров»), но это только меняет свое значение. Я хочу изменить имя поля в качестве примера выше. Может ли кто-нибудь дать представление об этом?

ответ

1

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

Создание пользовательских аннотаций, чтобы держать все возможные различные варианты сериализации:

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CustomJsonProperty { 
    String propertyName(); 

    String format(); 

    @Target(ElementType.FIELD) 
    @Retention(RetentionPolicy.RUNTIME) 
    @Documented 
    @interface List { 
     CustomJsonProperty[] value(); 
    } 

} 

аннотировать класс соответственно:

@JsonSerialize(using = CustomJsonPropertySerializer.class) 
public class Bar { 

    @CustomJsonProperty.List({ 
     @CustomJsonProperty(propertyName = "first-name", format = "A"), 
     @CustomJsonProperty(propertyName = "firstName", format = "B") 
    }) 
    private String firstName; 

    @CustomJsonProperty.List({ 
      @CustomJsonProperty(propertyName = "last-name", format = "A"), 
      @CustomJsonProperty(propertyName = "lastName", format = "B") 
    }) 
    private String lastName; 

    @CustomJsonProperty.List({ 
      @CustomJsonProperty(propertyName = "gender-x", format = "A"), 
      @CustomJsonProperty(propertyName = "gender", format = "B") 
    }) 
    private String gender; 

    @JsonIgnore 
    private String format; 

    //getters & setters 

} 

Создание пользовательского сериализатора интерпретировать вашу новую аннотацию:

public class CustomJsonPropertySerializer extends JsonSerializer<Bar> { 

    @Override 
    public void serialize(Bar bar, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
      throws IOException { 
     jsonGenerator.writeStartObject(); 

     Field[] fields = bar.getClass().getDeclaredFields(); 

     for (Field field : fields) { 
      field.setAccessible(true); 
      Object value = null; 

      try { 
       value = field.get(bar); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 

      if (field.isAnnotationPresent(CustomJsonProperty.List.class)) { 
       CustomJsonProperty[] properties = field.getAnnotation(CustomJsonProperty.List.class).value(); 
       CustomJsonProperty chosenProperty = null; 

       for (CustomJsonProperty c : properties) { 
        if (c.format().equalsIgnoreCase(bar.getFormat())) { 
         chosenProperty = c; 
         break; 
        } 
       } 

       if (chosenProperty == null) { 
        //invalid format given, use first format then 
        chosenProperty = properties[0]; 
       } 

       jsonGenerator.writeStringField(chosenProperty.propertyName(), value.toString()); 
      } 
     } 

     jsonGenerator.writeEndObject(); 
    } 
} 

Теперь вы можете сериализовать свои объекты с учетом различные форматы имен свойств:

public static void main(String[] args) throws IOException { 
    Bar bar1 = new Bar("first", "last", "m", "A"); 
    Bar bar2 = new Bar("first", "last", "m", "B"); 

    ObjectMapper mapper = new ObjectMapper(); 
    String json1 = mapper.writeValueAsString(bar1); 
    String json2 = mapper.writeValueAsString(bar2); 

    System.out.println(json1); 
    System.out.println(json2); 

} 

Выход:

{"first-name":"first","last-name":"last","gender-x":"m"} 
{"firstName":"first","lastName":"last","gender":"m"} 

Конечно выше сериализатору работает только для объектов Bar, но это может быть легко решена с помощью наследования с abstract String getFormat(); на суперкласс и изменения пользовательский сериализатор, чтобы принять тип суперкласса, а не Bar.

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

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