2016-10-31 7 views
0

私は「リストのネットワーク」について次のようなJSON応答解析する必要があります。これまでのところ、私は私の希望Network.javaのPOJOクラスに変換するcom.fasterxml.jacksonを使用していると、それがあった、今jsonライブラリを変更してjson配列をcom.fasterxml.jacksonからorg.codehaus.jacksonにデシリアライズしますか?

[ 
    { 
    "Name": "bridge", 
    "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", 
    "Scope": "local", 
    "Driver": "bridge", 
    "EnableIPv6": false, 
    "Internal": false, 
    "IPAM": { 
     "Driver": "default", 
     "Config": [ 
     { 
      "Subnet": "172.17.0.0/16" 
     } 
     ] 
    }, 
    "Containers": { 
     "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { 
     "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", 
     "MacAddress": "02:42:ac:11:00:02", 
     "IPv4Address": "172.17.0.2/16", 
     "IPv6Address": "" 
     } 
    }, 
    "Options": { 
     "com.docker.network.bridge.default_bridge": "true", 
     "com.docker.network.bridge.enable_icc": "true", 
     "com.docker.network.bridge.enable_ip_masquerade": "true", 
     "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", 
     "com.docker.network.bridge.name": "docker0", 
     "com.docker.network.driver.mtu": "1500" 
    } 
    }, 
    { 
    "Name": "none", 
    "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", 
    "Scope": "local", 
    "Driver": "null", 
    "EnableIPv6": false, 
    "Internal": false, 
    "IPAM": { 
     "Driver": "default", 
     "Config": [] 
    }, 
    "Containers": {}, 
    "Options": {} 
    }, 
    { 
    "Name": "host", 
    "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", 
    "Scope": "local", 
    "Driver": "host", 
    "EnableIPv6": false, 
    "Internal": false, 
    "IPAM": { 
     "Driver": "default", 
     "Config": [] 
    }, 
    "Containers": {}, 
    "Options": {} 
    } 
] 

を意図どおりに動作します。 jsonInputは、文字列として上記のJSONレスポンスである

public static List<Network> getNetworksFromResponse(String jsonInput, Network obj) 
{ 
    ObjectMapper mapper = new ObjectMapper(); 
    try 
    { 
     return mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, Network.class)); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 

: はここに私の古いコードです。ここでの問題は、単純なListネットワークリストpojoを使用するためのルート "Network"キーがないことです。だから私は、ネットワークのリストを返すメソッドにこのjsonレスポンス全体を渡さなければなりません。

Network.java:

public class Network 
{ 
    private String EnableIPv6; 
    private String Driver; 
    private String Name; 
    private String Labels; 
    private String Internal; 
    private String Id; 
    private Options Options; 
    private String Scope; 
    private IPAM IPAM; 

    public String getEnableIPv6() 
    { 
     return EnableIPv6; 
    } 

    @JsonProperty("EnableIPv6") 
    public void setEnableIPv6(String EnableIPv6) 
    { 
     this.EnableIPv6 = EnableIPv6; 
    } 

    public String getDriver() 
    { 
     return Driver; 
    } 

    @JsonProperty("Driver") 
    public void setDriver(String Driver) 
    { 
     this.Driver = Driver; 
    } 

    public String getName() 
    { 
     return Name; 
    } 

    @JsonProperty("Name") 
    public void setName(String Name) 
    { 
     this.Name = Name; 
    } 

    public String getInternal() 
    { 
     return Internal; 
    } 

    @JsonProperty("Internal") 
    public void setInternal(String Internal) 
    { 
     this.Internal = Internal; 
    } 

    public String getId() 
    { 
     return Id; 
    } 

    @JsonProperty("Id") 
    public void setId(String Id) 
    { 
     this.Id = Id; 
    } 

    public Options getOptions() 
    { 
     return Options; 
    } 

    @JsonProperty("Options") 
    public void setOptions(Options Options) 
    { 
     this.Options = Options; 
    } 

    public IPAM getIPAM() 
    { 
     return IPAM; 
    } 

    @JsonProperty("IPAM") 
    public void setIPAM(IPAM IPAM) 
    { 
     this.IPAM = IPAM; 
    } 

    public String getScope() 
    { 
     return Scope; 
    } 

    @JsonProperty("Scope") 
    public void setScope(String Scope) 
    { 
     this.Scope = Scope; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [EnableIPv6 = " + EnableIPv6 + ", Driver = " + Driver + ", Name = " + Name + ", Labels = " + Labels 
       + ", Internal = " + Internal + ", Id = " + Id + ", Options = " + Options + ", IPAM = " + IPAM + ", Scope = " 
       + Scope + "]"; 
    } 
} 

今すぐorg.codehausライブラリを使用している他のいくつかの方法があり、今後のjarの競合があります。だから私はcom.codehaus.jacksonに私のcom.fasterxml.jacksonを変更する必要があります。 私はCodehausのLIBSのにインポートラインを変えてみました、それは私にこのエラーを与える:

The method getTypeFactory() is undefined for the type ObjectMapper 

同等このmapper.readValue(...)のための方法またはCodehausの中getTypeFactory()メソッドは何? またはorg.codehaus.jacksonのmapper.getTypeFactory().constructCollectionType(List.class, Network.class) の同等のメソッドは何ですか?

答えて

0

com.fasterxml.ジャクソンからorg.codehaus.ジャクソンへ行く」という回答は、通常「しない」です。これは前者がJackson 2.xを意味するため、より多くの機能を備えたバージョンを維持していたからです。過去4年間は大幅に更新されていないJackson 1.xの後者である。

これは言いましたが、ジャクソン1.x ObjectMapperは、様々なreadValue()の方法を持つ必要があり、TypeFactoryにアクセスすることができます。しかし、あなたはconfigオブジェクト経由でアクセスする必要があるかもしれません。以下のようなもの:

mapper.getSerializationConfig().getTypeFactory(); 

(スペルチェック、名前が多少異なる場合があります)

+0

はい、あなたは最新のものを使用する必要がありますが、それがあったので、私はorg.codehaus.jacksonの瓶を使用し非常に巨大なコードベースを持っていますそのような短い予告で私が実際にそれをすることはできません。しかし、はい、com.fasterxml.jacksonからorg.codehaus.jacksonに行くことはお勧めしません。 – Siddharth

関連する問題