Java 使用jackson映射未命名数组

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

在未指定光标的情况下点击API端点将返回此JSON响应:

[“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]]]