2016-08-03 13 views
0

このような投稿はたくさんありましたが、まだ適切なanwserを見つけることができません。Json Jacksonは内部オブジェクトを逆シリアル化しません(プロパティではnull)

私は最初のものは、すべての情報が、それはこのようになりヘッダのクラスを含み、ウェブサイト

public class WebJSONObject { 
    @JsonDeserialize(using = HeadersDeserializer.class) 
    private Headers headers; 

    private String origin; 

    private String url; 
    //getters and seters 
} 

からもらっ保持している2クラス

を持っているウェブ

{ 
    "args": { 

    }, 
    "headers": { 
    "Accept": "application/json", 
    "Accept-Encoding": "gzip", 
    "Content-Length": "0", 
    "Host": "httpbin.org", 
    "User-Agent": "Dalvik/1.6.0 (Linux; U; Android 4.3; C5303 Build/12.1.A.1.205)" 
    }, 
    "origin": "91.193.147.8", 
    "url": "https://httpbin.org/get" 
} 

から与えられたJSONを解析する必要があります:

@JsonRootName("headers") 
public class Headers { 

    @JsonProperty("Accept") 
    private String accept; 

    @JsonProperty("Accept-Encoding") 
    private String acceptEncoding; 

    @JsonProperty("Content-Length") 
    private String contentLenght; 

    @JsonProperty("Host") 
    private String host; 

    @JsonProperty("User-Agent") 
    private String userAgent; 
    //Getters and setters 
} 
起源やURLなどのの

プロパティが適切に 解析されますが、ヘッダークラ​​ス

の問題がここにあり、私はWebJsonObjectのテスト・解析を行う際に、その(よくやっ起源もここに私のderserializer

public class HeadersDeserializer extends JsonDeserializer<Headers> { 

    @Override 
    public Headers deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); 

     JsonNode node = mapper.readTree(jsonParser); 

     //for testing issue (parsing properly) 
     //Json String: {"origin":"91.193.147.8","url":"https://httpbin.org/get"} 
     TreeNode tree = jsonParser.getCodec().readTree(jsonParser); 
     String node_as_text2 = tree.toString(); 
     WebJSONObject wbo = mapper.readValue(node_as_text2,WebJSONObject.class); 

     //Json String {"Accept":"application/json","Accept-Encoding":"gzip","Content-Length":"0","Host":"httpbin.org","User-Agent":"Dalvik/1.6.0 (Linux; U; Android 4.3; C5303 Build/12.1.A.1.205)"} 
     String node_as_text = mapper.writeValueAsString(node); 
     Headers headers = mapper.readValue(node_as_text,Headers.class); 

     return headers; 
    } 
} 

で、 urlはvaluseで埋められています) 問題は、私がParse Headersを使うと、すべてのプロパティがnullで埋められることです。

+0

ユーザーreftrofitをし、あなたも@JsonDeserializeが必要です与えられた応答 –

+1

からPOJOを作成します。

一つは、単に行うことができますか?私はあなたが達成したいと思うものは、まったくそれを必要としないと思います。あなたはその行にコメントすればどうなりますか? – Fabio

+0

私はまだこの行を削除します。ヌルまたはヘッダークラ​​スのプロパティ –

答えて

0

私は問題を解決しました。これはコードそのものとは無関係でした。

間違った事は、私が代わりに

import com.fasterxml.jackson.annotation.JsonProperty 

import org.codehaus.jackson.annotate.JsonProperty; 

を輸入していることだった...

コードは (@Fabioが言ったように)必要がないという事実にもかかわらずokですデシリアライザを書く。

public class WebJSONObject { 
    private Headers headers; 

    private String origin; 

    private String url; 
    //setters and getters 

public class Headers { 

    @JsonProperty("Accept") 
    private String accept; 

    @JsonProperty("Accept-Encoding") 
    private String acceptEncoding; 

    @JsonProperty("Content-Length") 
    private String contentLenght; 

    @JsonProperty("Host") 
    private String host; 

    @JsonProperty("User-Agent") 
    private String userAgent; 
    //setters and getters 
+0

ああ昔のコードハウスはまだ周りです。コードハウスの間接的なインクルードを取得した場合、それはかなり頭痛になる可能性があります。依存関係を確認する – Fabio

1

@JsonRootName("headers")を使用すると、json全体を解析してHeadersオブジェクトにすると仮定しています。

あなたはこのような何かを書いた場合、それが仕事だろうと私の悪い記憶を寛容:

Headers headers = objectMapper.readValue(string,Headers.class);

をしかし、あなたが言及ので、あなたはあなたが何かをしたことを意味している正しく起源とURLを解析していることそれが正しいなら

WebJSONObject object = objectMapper.readValue(string, WebJSONObject.class);

のようなソリューションは、@JsonRootName@JsonDeserializeの両方をドロップについてです。

実際、これらの注釈のいずれかを使用したり、デシリアライザを最初から書き込むことは非常に珍しいことです。彼らは、jsonとPOJOの間に直接の関連性がないエッジの場合にのみ必要であり、多くの場合でも、UNWRAP_ROOTのような他の機能を取り除くことができます。

+0

また、Jacksonが本当にデフォルトのコンストラクタを必要としている非常に特殊なケースを見てきました。 'public Headers(){System.out.println(" Helloヘッダー ")}'を試してみてください。 – Fabio

+0

私はコードに無関係な解決策を見つけました。とにかくあなたのanwserのためにありがとう –

関連する問題