我知道有很多这样的帖子,但我仍然无法找到合适的礼物。
我需要从网上解析给出的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
}
它包括看起来像这样的Headers类:
@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
}
正确解析了origin和url等属性 但是Header类存在问题
这是我的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) 问题是当我解析Headers时,所有属性都填充为null。
答案 0 :(得分: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等其他功能。
答案 1 :(得分: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