2016-08-03 3 views
0

Я знаю, что было много таких сообщений, но все же я не могу найти подходящего anwser.Json Jackson не десериализует внутренний объект (null по свойствам)

Мне нужно, чтобы разобрать данный JSon из Интернета

{ 
    "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" 
} 

У меня есть 2 классов

первого один содержит все информацию, полученную с сайта

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

    private String origin; 

    private String url; 
    //getters and seters 
} 

включает в себя заголовки класса, который выглядит примерно так :

@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 обрабатываются правильно , но есть проблема с классом заголовка

Вот мой 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; 
    } 
} 

Также здесь, когда я делаю тест-разбор WebJsonObject его сделали хорошо (происхождение и url заполнены valuse) Проблема в том, когда i Parse Headers, все свойства заполнены нулем.

+0

пользователь reftrofit и создавать POJO из данного ответа –

+1

ли вам даже не нужно @JsonDeserialize? Я думаю, что то, чего вы хотите достичь, не нуждается в этом вообще. Что произойдет, если вы просто прокомментируете эту строку? – Fabio

+0

, когда я удаляю эту строку, все еще не разбираюсь. Свойства класса Nulls или Header –

ответ

0

Я решил проблему. Что не связано с самим кодом.

Неправильно было то, что я импортировал

import org.codehaus.jackson.annotate.JsonProperty; 

вместо

import com.fasterxml.jackson.annotation.JsonProperty 

...

код нормально, несмотря на то, что (как сказал @Fabio) нет необходимости написать любой Deserializer.

Можно просто сделать:

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

О, да, старый кодхот все еще вокруг. Будьте осторожны с тем, какие другие библиотеки вы используете, если вы получаете косвенное включение кодекса, это может быть довольно головная боль. Проверить с помощью зависимостей gradlew – 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

Также я видел очень частные случаи, когда Джексон действительно хочет, чтобы у вас был конструктор по умолчанию. Попробуйте 'public Headers() {System.out.println (« Привет, заголовки »)} и сообщите нам, если это вызвано вообще. – Fabio

+0

Я нашел решение, не связанное с кодом. Спасибо вам за ваш anwser в любом случае –

Смежные вопросы