簡體   English   中英

RestTemplate如何解析響應

[英]How RestTemplate parse response

在開發spring REST Client時,出現一個問題:

  1. 我有下一個json:


{
 "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”以獲取直接值嗎? 一些模板?

  1. 從“主鍵是結果”開始:

    一種。 如果您只處理以下一種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(); 
  2. 從名為“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM