在使用ObjectMapper解析json响应到Java类对象时,我得到了解析JsonMappingException的消息-无法从START_ARRAY令牌中反序列化com.handson.ResponseParser的实例
假设我有下面的json响应-
{
"statuses": [
{
"engine": "f4651cbc-a79c-4269-9711-1aeaaeff6369",
"invocations": [
{
"outputs": {
"aggrplan": {
"path": "http://someurl.com",
"repo": "S3",
"format": "application/json"
}
},
"message": "complete",
"status": "200"
}
]
}
],
"request_id": "fce46502095607ef"
}
在main方法中,我通过下面的逻辑->进行解析
ResponseParser parser = null;
if(result.length() > 0) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
parser = objectMapper.readValue(result, ResponseParser.class);
}
这是我想要将json响应映射到的类:
@JsonRootName(value = "statuses")
public class ResponseParser {
@JsonProperty(value = "request_id")
private String requestId;
@JsonProperty(value = "statuses")
private List<Map<String, String>> statuses;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public List<Map<String, String>> getStatuses() {
return statuses;
}
public void setStatuses(List<Map<String, String>> statuses) {
this.statuses = statuses;
}
}
发布于 2019-08-05 00:48:19
您的POJO
不适合JSON
负载。首先,您不需要DeserializationConfig.Feature.UNWRAP_ROOT_VALUE
,因为ResponseParser
是您的根对象。其次,您需要使用带有Object
值而不是String
值的List<Map<String, Object>>
- Map
,而不是List<Map<String, String>>
。如下例所示:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.List;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(jsonFile, ResponseParser.class));
}
}
class ResponseParser {
@JsonProperty(value = "request_id")
private String requestId;
private List<Map<String, Object>> statuses;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public List<Map<String, Object>> getStatuses() {
return statuses;
}
public void setStatuses(List<Map<String, Object>> statuses) {
this.statuses = statuses;
}
@Override
public String toString() {
return "ResponseParser{" +
"requestId='" + requestId + '\'' +
", statuses=" + statuses +
'}';
}
}
上面的代码打印:
ResponseParser{requestId='fce46502095607ef', statuses=[{engine=f4651cbc-a79c-4269-9711-1aeaaeff6369, invocations=[{outputs={aggrplan={path=http://someurl.com, repo=S3, format=application/json}}, message=complete, status=200}]}]}
https://stackoverflow.com/questions/57255222
复制相似问题