[英]How RestTemplate parse response
在開發spring REST Client時,出現一個問題:
{
"return": [
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [],
"id": {"value": 1},
"locked": false,
"loggedInCount": 0,
"master": true,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "NGCP"
},
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [{"value": 2}],
"id": {"value": 3},
"locked": false,
"loggedInCount": 0,
"master": false,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "POLICY"
}
]
}
保存用戶的模型類:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
public User(){
}
private boolean admin;
private String alias;
private String email;
private String emailId;
private ArrayList<String> groups;
private String id;
private boolean locked;
private int loggedInCount;
private boolean master;
private String sms;
private String smsId;
private String type;
private String userName;
//getter and setters
}
現在,我使用“ RestTemplate”獲取結果。
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User[]> response = restTemplate.exchange(URL_GET,HttpMethod.GET,request, User[].class);
並得到錯誤。 我知道這是因為主鍵是“結果”,但是我可以指定restTemplate從哪里解析此JSON?
並且有可能在文件名上顯示“ emailId”以獲取直接值嗎? 一些模板?
從“主鍵是結果”開始:
一種。 如果您只處理以下一種Web服務,我將為實際的有效負載創建一個包裝類:
public class Return{ // Class property cannot be called "return" because it is Java reserved name. @JsonProperty("return") private User[] array; .... getter and setter }
b。 如果您處理多個Web服務,而實際負載在“返回”字段中,則將創建一個通用包裝器類:
public class Return<T>{ // Class property cannot be called "return" because it is Java reserved name. @JsonProperty("return") private T[] array; .... getter and setter }
致電RestRemplate
:
ResponseEntity<Return<User>> response = restTemplate.exchange(URL_GET, HttpMethod.GET, request, new ParameterizedTypeReference<Return<User>>(){}); User[] usersArray = response2.getBody().getArray();
從名為“ value”的JSON屬性中的屬性值開始,我將創建兩個自定義JsonDeserializer
(一個):一個用於單個值,一個用於值數組,並在適用的地方使用@JsonDeserialize
注釋每個屬性:
單值解串器:
public class StringValueDeserializer extends JsonDeserializer<String>{ @Override public String deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { ObjectCodec codec = parser.getCodec(); TreeNode node = codec.readTree(parser); JsonNode value = (JsonNode)node.get("value"); if (value != null){ return value.asText(); } return null; } }
值序列化器數組:
public class StringArrayValueDeserializer extends JsonDeserializer<List<String>>{ @Override public List<String> deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { List<String> ret = new ArrayList<>(); ObjectCodec codec = parser.getCodec(); TreeNode node = codec.readTree(parser); if (node.isArray()){ for (JsonNode n : (ArrayNode)node){ JsonNode value = n.get("value"); if (value != null){ ret.add(value.asText()); } } } return ret; } }
這是新的User.class
:
public class User { private boolean admin; private String alias; private String email; @JsonDeserialize(using = StringValueDeserializer.class) private String emailId; @JsonDeserialize(using = StringArrayValueDeserializer.class) private ArrayList<String> groups; @JsonDeserialize(using = StringValueDeserializer.class) private String id; private boolean locked; private int loggedInCount; private boolean master; private String sms; @JsonDeserialize(using = StringValueDeserializer.class) private String smsId; private String type; private String username; .... getter and setter }
祝好運!
您可以使用注釋@JsonRootName在響應中指定根元素。 所以試試這個:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value ="result")
public class User {
public User(){
}
private boolean admin;
....
}
您還可以使用JsonPath庫瀏覽json:
String json = restTemplate.exchange(URL_GET,HttpMethod.GET,request, String.class);
DocumentContext document = JsonPath.parse(content, json);
List<User> users = document.read("$.return.*", new TypeRef<List<User>>() {});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.