2016-04-03 3 views
0

私はysonファイルをjsonと同様に動作するjacksonを使用して逆シリアル化しようとしています。便宜上Jsonを使用します。jacksonはカスタムエンティティに不明なプロパティ名をデシリアライズ

私のJSONの構造は次のようになります。

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

私はジャクソンを使用して、これをデシリアライズしたいのですが、デフォルトObjectMapperを使用したとき、私はUnknownPropertyExceptionを取得しています。

これは私がデシリアライズしようとしているクラスです。

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:私はJSONの構造を説明する際に間違っていた

public class ServiceModel { 

List<ContainerModel> containers; 

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

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

マイコンテナモデルは次のようになります。私はここでJsonNode

それをマッピングしたときに、アプリとの結果がContainerModel

+0

デシリアライズするクラス(の一部)を提供できますか? – nyname00

+0

@ nyname00編集を見てください。ありがとう – Sid

+0

@ r0shi、 'ContainerModel'も投稿できますか? – Casey

答えて

2

編集

ServiceModelクラスは次のようになり、新しいJSON構造を見て:あなたはContainerModelに、キー(文字列)から、あなたのマッピングを取得

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

この方法です。

オリジナルポスト

さて、あなたのJSONの例はservicesと呼ばれる性質を持っており、あなたのクラスがcontainersというプロパティがあります。それらのプロパティ間の自動マッピングは期待できません。

自動的にマップするには、同じプロパティ名を使用します。あなたがしたくない場合、またはできない場合は、いつでもJacksonの注釈@JsonPropertyを使用することができます。 さらに、マップしたくないフィールドがある場合は、新しいObjectMapperをインスタンス化し、未知のフィールドを無視するように構成する必要があります。このように:

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

また、私はあなたが例外が//Known data structure ServiceModelクラスをマッピングし、ない得ることを想定しています。しかし、いずれにしても私の提案はどちらの場合でも問題を解決するはずです。

+0

ServiceModelをマップするサービス用のラッパーもありますので、問題はないと思います。問題は、var1をContainerModelにマッピングするときに発生します。 – Sid

+0

Ah!そうですか。あなたの構造は正確ではないようです。これは、次のようなものでなければなりません: "サービス":[{ここのContainerModel要素}、{ここにある別のContainerModel要素}] – pca

+0

ええ、私はキーを知らないとどのようにマップしますか? – Sid

0

にマッピングされることになっているあなたはdoesnのプロパティをデシリアライズしようとしているように見えジャクソンが生成された修正JSON構造を見てください存在しない。

デフォルトでは、未知のプロパティを逆シリアル化しようとすると、Jacksonは例外をスローします。あなたのObjectMapperインスタンスに以下を追加することで、これを無効にすることができます

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

あなたは可能性が高いものの、未知のプロパティを修正することをお勧めします。 Javaクラスにcontainersと宣言した可能性があります。servicesプロパティです。

+0

まあ、コンテナプロパティは存在します、それはそれが未知のものです。 – Sid

+0

配列 'services'は' ServiceModel'インスタンスか 'ContainerModel'インスタンスのリストですか? – Casey

+0

配列サービスはContainerModelインスタンスのリストですが、必要に応じてServiceModelを完全に削除し、現在サービス配列を格納しているラッパーモデルでList を使用できます。 私は基本的にdocker-compose.ymlのパーサを書いています。それはよく知っていて、構造体の完全な参照をしたい場合です。 – Sid

関連する問題