2016-04-15 11 views
1

Ich habe dieses JSON deserialisieren:Jackson Serialize Field anderen Namen

[A]

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

:

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

ich es 2 verschiedene Formate serialisieren möchten [B]

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

Ich kann es in 1 Format serialisieren: [A] nur oder [B] nur. Hier ist mein Code, um es auf [B] zu serialisiert:

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

Ich las über JsonView hier http://www.baeldung.com/jackson-json-view-annotation (siehe Abschnitt '5. Anpassen JSON Views'), aber es ändert sich nur seinen Wert. Ich möchte den Feldnamen als Beispiel oben ändern. Kann jemand dazu einen Einblick geben?

Antwort

1

Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstehe, aber für das, was ich verstehen konnte, können Sie so etwas tun, um verschiedene Serialisierungen zu erreichen.

Erstellen Sie eine benutzerdefinierte Anmerkung alle möglichen verschiedenen Serialisierungsoptionen zu halten:

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

    String format(); 

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

} 

Beschriften Sie Ihre Klasse entsprechend:

@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 

} 

Erstellen eines benutzerdefinierten Serializer Ihre neue Anmerkung zu interpretieren:

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

Jetzt können Sie Ihre Objekte serialisieren unter Berücksichtigung verschiedene Formate für die Eigenschaftsnamen:

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

} 

Ausgang:

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

Natürlich ist die oben Serializer nur für Bar Objekte funktionieren, aber das leicht gelöst werden kann Vererbung mit abstract String getFormat(); auf der Super-Klasse und Ändern der benutzerdefinierte Serializer, um den Super-Class-Typ anstelle von Bar zu akzeptieren.

Vielleicht gibt es einen einfacheren Weg als das Erstellen eigener Sachen, aber ich weiß es nicht. Lass es mich wissen, wenn etwas nicht klar war und ich es noch einmal ausarbeiten kann.

Verwandte Themen