2016-04-03 16 views
0

Ich versuche eine yaml-Datei mit jeson zu deserialisieren, die ähnlich wie Json funktioniert, also werde ich Json für Bequemlichkeit verwenden.jackson deserialize unbekannter Eigenschaftsname zu benutzerdefinierter Entität

Meine Json Struktur sieht wie folgt aus:

{ 
    "version": "2", 
    "services": { 
     "app": { 
      "build": { 
       "context": "./", 
       "args": {} 
      }, 
      "image": "imageName" 
     }, 
     "results": { 
      "build": "./", 
      "image": "imageName" 
     } 
    } 
}  

Ich möchte dies mit Jackson deserialisieren, aber ich bin UnknownPropertyException bekommen, wenn die Standard-ObjectMapper verwenden.

Dies ist die Klasse I bis deserialisieren versuchen:

public class ServiceModel { 

List<ContainerModel> containers; 

public List<ContainerModel> getContainers() { 
    return containers; 
} 

public void setContainers(List<ContainerModel> containers) { 
    this.containers = containers; 
} 
} 

Mein Container-Modell etwa wie folgt aussieht:

public class ContainerModel { 

@JsonProperty("build") 
private String build; 

@JsonProperty("args") 
private List<String> args; 

@JsonProperty("context") 
private String context; 

@JsonProperty("dockerfile") 
private String dockerFile; 

// Getters and Setters below 

EDIT: Ich war falsch bei der Beschreibung der Json Struktur. Bitte sehen Sie die korrigierte Json-Struktur, die jackson erzeugt wird, wenn ich es JsonNode abgebildet

Hier App und Ergebnisse sollen ContainerModel abgebildet werden

+0

Können Sie (Teile davon) die Klasse angeben, die Sie deserialisieren? – nyname00

+0

@ nyname00 schauen Sie sich bitte die Änderung an. danke – Sid

+0

@ r0shi, kannst du auch 'ContainerModel' posten? – Casey

Antwort

2

bearbeiten

Ein Blick auf Ihre neue Json Struktur der Servicemodel-Klasse sollte wie folgt aussehen:

public class ServiceModel { 
    private String version; 
    private Map<String, ContainerModel> containers; 
    // Other fields here... 

    public void setContainers(Map<String, ContainerModel> containers) { 
     this.containers = containers; 
    } 

    public Map<String, ContainerModel> getContainers() { 
     return containers; 
    } 

    public void setVersion(String version) { 
     this.version = version; 
    } 

    public String getVersion() { 
     return version; 
    } 

    // Other setters/getters here... 
} 

So können Sie Ihre Zuordnung von einem Schlüssel (String), zu einem ContainerModel bekommen.

Original-Beitrag

Nun, Ihr Json Beispiel hat eine Eigenschaft namens services und Ihre Klasse hat eine Eigenschaft namens containers. Sie sollten keine automatische Zuordnung zwischen diesen Eigenschaften erwarten.

Um sie automatisch zuzuordnen, verwenden Sie dieselben Eigenschaftsnamen. Wenn Sie nicht wollen oder können, können Sie immer Jacksons Annotation @JsonProperty verwenden. Wenn Felder nicht zugeordnet werden sollen, sollten Sie außerdem einen neuen ObjectMapper instanziieren und so konfigurieren, dass unbekannte Felder ignoriert werden. Wie folgt aus:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 

Auch ich gehe davon aus, dass Sie die Ausnahme erhalten die Servicemodel-Klasse abbildet und nicht die //Known data structure. Aber auf jeden Fall sollte mein Vorschlag das Problem in beiden Fällen lösen.

+0

Ich habe auch einen Wrapper für Dienste, der das ServiceModel abbildet, also würde ich annehmen, dass das nicht das Problem ist. Das Problem tritt beim Zuordnen von var1 zu ContainerModel auf – Sid

+0

Ah! Aha. Dann scheint mir deine Struktur nicht genau zu sein. Es sollte etwa so aussehen: "services": [{ContainerModel-Element hier}, {ein anderes ContainerModel-Element hier}] – pca

+0

Ja, aber wie kann ich es abbilden, wenn ich den Schlüssel nicht kenne (und dafür einen Schlüssel haben soll) – Sid

0

Es sieht aus wie Sie eine Eigenschaft deserialisiert sind versucht, die doesn Ich existiere nicht.

Standardmäßig wird Jackson eine Ausnahme auslösen, wenn Sie versuchen, eine unbekannte Eigenschaft zu deserialisieren. Sie können dies deaktivieren, indem Sie die folgenden auf Ihre ObjectMapper Instanz hinzu:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

Sie werden wahrscheinlich obwohl die unbekannte Eigenschaft festlegen möchten. Es ist wahrscheinlich die services-Eigenschaft, die Sie in Ihrer Java-Klasse als containers deklariert haben.

+0

Nun, die Container-Eigenschaft existiert, es ist nur, dass der Name dafür unbekannt ist – Sid

+0

Ist der Array 'services' eine Liste von' ServiceModel'-Instanzen oder 'ContainerModel'-Instanzen? – Casey

+0

Die Array-Services sind eine Liste von ContainerModel-Instanzen, obwohl ich ServiceModel bei Bedarf komplett eliminieren und List im Wrapper-Modell verwenden kann, in dem derzeit das Services-Array gespeichert ist. Ich schreibe im Grunde einen Parser für docker-compose.yml, wenn Sie vertraut sind und eine vollständige Referenz der Struktur haben möchten – Sid

Verwandte Themen