2012-09-14 7 views
20

Ich denke, ich muss einen Spezialisten ObjectMapper erstellen und kann keinen Beispielcode finden, um den Prozess zu starten.Ändern Feld Fall mit einem ObjectMapper

Der Ersteller des JSON verwendet die Eigenschaften .Net und public und verwendet daher Feldnamen mit einem Großbuchstaben. Ich analysiere den JSON in POJOs, also würde ich gerne einen Kleinbuchstaben verwenden.

An ihrem Ende:

public class Facet 
    { 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

In meinem Ende muss ich deshalb haben:

public class Facet { 
     public String Name; 
     public String Value; 
    } 

Ich würde viel lieber:

public class Facet { 
     public String name; 
     public String value; 
    } 

Bin ich richtig, dass dies geschehen könnte mit einer ObjectMapper?

+1

Ich habe retitled und entfernt, um den zweiten Teil der Frage. Die andere Hälfte wird [hier] gepostet (http://stackoverflow.com/q/12450404/823393) – OldCurmudgeon

Antwort

23

Ihre erste Ausgabe mit der @JsonProperty Anmerkung sehr einfach angesprochen werden:

// java-side class 
public class Facet 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

Nun ist die ObjectMapper wird die unterschiedlich Gefasste Feldnamen übereinstimmen. Wenn Sie keine Anmerkungen in Ihre Klassen hinzufügen möchten, können Sie eine Mix-in-Klasse Stand in für Ihre Facet erstellen:

public class FacetMixIn 
{ 
    @JsonProperty("Name") 
    public String name; 

    @JsonProperty("Value") 
    public String value; 
} 

objectMapper.getDeserializationConfig().addMixInAnnotations(Facet.class, FacetMixIn.class); 

Dies wird die gleiche Sache erreichen, ohne dass zusätzliche Anmerkungen in Ihrem Facet Klasse.

+0

Das ist genau das, was ich in Teil 1 gesucht habe :) Danke. Ich habe Teil 2 hinzugefügt. Macht das das leichter? – OldCurmudgeon

+0

Ich habe die ursprüngliche Frage jetzt in zwei geteilt, also ist dies jetzt eine vollständige Antwort. Auf jeden Fall modifizieren, um die Änderung in der Frage widerzuspiegeln. – OldCurmudgeon

14

Anstatt jedes Feld zu kommentieren, kann der Jackson ObjectMapper so konfiguriert werden, dass er eine integrierte oder benutzerdefinierte PropertyNamingStrategy verwendet, um eine konsistente Übersetzung zwischen Java-Eigenschaften-/Feldnamen und JSON-Elementnamen anzuwenden.

Zum Beispiel:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy); 
+0

Danke @ProgrammerBruce für Ihre weitere Hilfe. Ich werde überprüfen, ob das funktioniert, wenn ich später im neuen Jahr wieder arbeiten werde. BTW - gibt es eine Strategie, die auf jeden Fall passt? Wenn nein, könntest du vielleicht einen schicken. Ich versuche, mit einem Kunden zu verhandeln, der jederzeit seine Konventionen ändern kann. – OldCurmudgeon

+0

Zuletzt habe ich (vor etwa einem Jahr) gesehen, dass Namensübersetzungen nur in eine Richtung gehen (entweder von Java-Eigenschaften-/Feldnamen zu JSON-Elementnamen oder umgekehrt) und die Implementierung von Groß-/Kleinschreibung nicht so trivial war es könnte sonst sein. –

+0

@Jose: Sie sind verschiedene Dinge. SnakeCaseStrategy ist für "snake_case_variables" – dagnelies

5

Dieses Problem aus Jackson 2.5.0 wie diese gelöst werden könnte:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

Vom javadoc:

com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES

Funktion, die eine fehleranfällige Deserialisierung des eingehenden JSON ermöglicht. Wenn diese Option aktiviert ist, werden die Bean-Eigenschaften mit ihren kleingeschriebenen Entsprechungen abgeglichen. Dies bedeutet, dass jede Fallkombination (eingehende und übereinstimmende Namen werden durch Untergehäuse kanonisiert werden) funktionieren sollte.

Beachten Sie, dass ein zusätzlicher Leistungsaufwand besteht, da die eingehenden Eigenschaftsnamen vor dem Vergleich untergeordnet sein müssen, für Fälle , in denen es Großbuchstaben gibt. Overhead für Namen, die bereits Kleinbuchstaben sind, sollte jedoch vernachlässigbar sein.

Die Funktion ist standardmäßig deaktiviert.

seit: 2,5