【发布时间】:2018-03-30 08:43:47
【问题描述】:
我在反序列化 JSON 字符串时遇到问题。我想我什么都试过了,但我卡住了。到目前为止,这是我的代码。马文:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.26</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.26</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.26</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.9.2</version>
</dependency>
实体:
@JsonIgnoreProperties(ignoreUnknown = true)
public class ImportTask {
@JsonProperty("ID")
private long id;
@JsonProperty("Name")
private String name;
@JsonProperty("Description")
private String description;
public ImportTask() {
}
// getters and setters
}
客户:
List<ImportTask> importTaskList = new ArrayList<ImportTask>();
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
JacksonJaxbJsonProvider jacksonJaxbJsonProvider = new JacksonJaxbJsonProvider();
jacksonJaxbJsonProvider.setMapper(mapper);
Client client = ClientBuilder.newClient(new ClientConfig(jacksonJaxbJsonProvider));
Response response= client
.target("http://localhost:51873/api/getImportTaskList")
.request(MediaType.APPLICATION_JSON)
.get();
importTaskList = response.readEntity(new GenericType<List<ImportTask>>(){});
这是我从 web 服务获得的 JSON 字符串:
"[{\"ID\":16,\"Name\":\"name\",\"Description\":\"description\"}]"
我收到这个错误
javax.ws.rs.ProcessingException: Error reading entity from input stream.
.......
引起:com.fasterxml.jackson.databind.JsonMappingException: 可以 不在 VALUE_STRING 中反序列化 java.util.ArrayList 的实例 令牌
与作为 int 而非字符串传递的 Id 相关的错误吗? 任何帮助将不胜感激。
【问题讨论】:
-
可能与从响应中读取实体有关,而不是与您的模型本身有关。例如,如果您从
ObjectMapper中读取来自String的值,通过使用new TypeReference<List<ImportTask>>(){}进行参数化,它将成功反序列化。 -
无论出于何种原因,您的 JSON 是 JSON 字符串,而不是 JSON 数组。