2016-08-03 250 views
0

我知道有很多这样的帖子,但我仍然无法找到合适的anwser。Json Jackson不反序列化内部对象(null属性)

我需要解析来自网络

{ 
    "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我有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) 问题是当我解析头,所有的属性都填充null。

+0

用户reftrofit并从给定响应 –

+1

创建POJO你甚至需要@JsonDeserialize?我认为你想达到的目标完全不需要。如果你只是评论该行,会发生什么? – Fabio

+0

当我删除这条线仍然不解析。空值或标头类的属性 –

回答

0

我已经解决了问题。这与代码本身无关。

做错了一件事是,我进口

import org.codehaus.jackson.annotate.JsonProperty; 

,而不是

import com.fasterxml.jackson.annotation.JsonProperty 

...

代码是好的,尽管事实(如@Fabio说) 没有必要编写任何解串器。

人们可以简单地做:

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

噢老codehaus仍然在附近。要小心你使用的其他库,如果你间接包含codehaus,这可能会让你非常头疼。检查gradlew依赖关系 – Fabio

1

当你使用@JsonRootName("headers")你假设你将解析整个json到一个Headers对象中。

原谅我的记性不好,如果你写了这样的事情它会工作:

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

但既然你提到,你分析的起源和网址正确你暗示,你做了什么像

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

如果这是正确的解决方案是大约下降两@JsonRootName@JsonDeserialize

实际上,使用这些注释中的任何一个或从头开始编写解串器是非常不寻常的。它们仅仅用于json和POJO之间没有直接对应关系的边缘情况,即使在很多情况下,您也可以使用UNWRAP_ROOT等其他功能。

+0

另外我见过非常特殊的情况,杰克逊真的希望你有默认的构造函数。试试'public Headers(){System.out.println(“Hello headers”)}',让我们知道是否会被调用。 – Fabio

+0

我找到了与代码无关的解决方案。无论如何谢谢你的接吻 –