Java 使用jackson映射未命名数组
在未指定光标的情况下点击API端点将返回此JSON响应:Java 使用jackson映射未命名数组,java,json,twitter,jackson,Java,Json,Twitter,Jackson,在未指定光标的情况下点击API端点将返回此JSON响应: [“243439460”、“13334762”、“14654522”] 但是,在指定光标时,您会得到文档格式: {“下一个光标”:0,“上一个光标”:0,“ID”:[“243439460”、“13334762”、“14654522”]} 使用Jackson反序列化第二个响应很容易 @JsonIgnoreProperties(ignoreUnknown = true) public class FriendIds { private Lis
[“243439460”、“13334762”、“14654522”]
但是,在指定光标时,您会得到文档格式:
{“下一个光标”:0,“上一个光标”:0,“ID”:[“243439460”、“13334762”、“14654522”]}
使用Jackson反序列化第二个响应很容易
@JsonIgnoreProperties(ignoreUnknown = true)
public class FriendIds {
private List<String> ids;
public List<String> getIds() { return ids; }
public void setIds(List<String> ids) { this.ids = ids; }
}
@JsonIgnoreProperties(ignoreUnknown=true)
公共类友元{
私有列表ID;
public List getIds(){return ids;}
public void setIds(列表id){this.ids=ids;}
}
及
FriendIds-FriendIds=newObjectMapper().readValue(jsonStr,FriendIds.class)代码>
但是,我还没有找到类似的方法来使用Jackson反序列化对FriendID
的第一个响应。关于如何做到这一点有什么想法吗?首先将它们映射到id列表,如:
List<String> ids = mapper.readValue(json, List.class); // works because String happens to be 'natural' type for JSON Strings
List-id=mapper.readValue(json,List.class);//之所以有效,是因为字符串恰好是JSON字符串的“自然”类型
然后构造包装器对象
Jackson没有真正的方法知道JSON数组将用于构造POJO,其中一个字段将包含列表的内容,除非编写自定义反序列化程序。
这是一种可能性,如果你想这样做;事实上,这可以支持这两种情况。但是需要一些思考,对JSON对象使用一种方法(默认POJO deser),对JSON数组使用另一种方法。
因此,在杰克逊之外做这件事可能是最容易的。我希望这能有所帮助。您可以使用Spring RestTemplate.getForObject和Jackson注释来实现这一点
这是Twitter响应的类:
import java.util.List;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class TwitterResponse {
private List<TwitterId> ids;
@JsonCreator
public TwitterResponse(List<TwitterId> ids) {
this.ids = ids;
}
public List<TwitterId> getIds() {
return ids;
}
@Override
public String toString() {
return "TwitterResponse [ids=" + ids + "]";
}
}
一个简单的单元测试表明它是有效的。我刚刚创建了一个简单的控制器,可以返回上面的数据,我正在使用RestTemplate进行测试
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.client.RestTemplate;
public class ControllerTest {
private static final Logger log = LoggerFactory.getLogger(ControllerTest.class);
@Test
public void testTwitter() {
try {
RestTemplate restTemplate = new RestTemplate();
TwitterResponse twitterResponse =
restTemplate.getForObject("http://localhost:8080/twitter",
TwitterResponse.class);
log.debug("twitterResponse = {}", twitterResponse);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以及显示测试结果的控制台:
19:57:42.506 [main] DEBUG org.springframework.web.client.RestTemplate - Created GET request for "http://localhost:8080/twitter"
19:57:42.545 [main] DEBUG org.springframework.web.client.RestTemplate - Setting request Accept header to [application/json, application/*+json]
19:57:42.558 [main] DEBUG org.springframework.web.client.RestTemplate - GET request for "http://localhost:8080/twitter" resulted in 200 (OK)
19:57:42.559 [main] DEBUG org.springframework.web.client.RestTemplate - Reading [class org.porthos.simple.TwitterResponse] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4b5a5ed1]
19:57:42.572 [main] DEBUG org.porthos.simple.ControllerTest - twitterResponse = TwitterResponse [ids=[TwitterId [twitterId=243439460], TwitterId [twitterId=13334762], TwitterId [twitterId=14654522]]]
第一个响应不是JSON,它只是一个array@IgorDymov是的,是的。我最初是这么想的,但我扔给它的验证器都接受了。它是有效的JSON,没有问题,但作为一个数组,它需要映射到一个数组或集合。。。。
19:57:42.506 [main] DEBUG org.springframework.web.client.RestTemplate - Created GET request for "http://localhost:8080/twitter"
19:57:42.545 [main] DEBUG org.springframework.web.client.RestTemplate - Setting request Accept header to [application/json, application/*+json]
19:57:42.558 [main] DEBUG org.springframework.web.client.RestTemplate - GET request for "http://localhost:8080/twitter" resulted in 200 (OK)
19:57:42.559 [main] DEBUG org.springframework.web.client.RestTemplate - Reading [class org.porthos.simple.TwitterResponse] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4b5a5ed1]
19:57:42.572 [main] DEBUG org.porthos.simple.ControllerTest - twitterResponse = TwitterResponse [ids=[TwitterId [twitterId=243439460], TwitterId [twitterId=13334762], TwitterId [twitterId=14654522]]]