2016-07-13 81 views
1

在發展春天REST客戶端,出現了一個問題:如何RestTemplate解析響應

  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" 
} 
     ] 
} 

Model類,以節省用戶:

@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?

而且有可能在fileds上表明「emailId」以獲得直接價值嗎?一些模板?

+0

你是什麼意思的「直接獲取價值」嗎? –

+0

在這個領域,我再次配對,「關鍵 - 價值」。我只需要取值 – GVArt

+0

錯誤是什麼? 「主鍵是結果」是什麼意思? –

回答

3
  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. 如JSON屬性的屬性值所謂的「價值」我會創建兩個自定義JsonDeserializer(s):一個用於單個值,一個用於值數組,並用@JsonDeserialize註釋每個屬性的適用範圍:

    單值deseria lizer:

    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; 
        } 
    } 
    

    數組值的derializer:

    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 
    } 
    

祝你好運!

+0

你的答案很棒,謝謝! – GVArt

+1

:)不客氣! –

1

您可以使用註釋@JsonRootName指定響應中的根元素。所以,試試這個:

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonRootName(value ="result") 
public class User { 

    public User(){ 

    } 

    private boolean admin; 

    .... 
} 
+0

如果您使用User對象進行創建或更新,那麼json根名稱變體的作用是什麼?或者這僅用於讀取(獲取)數據。 –

1

您還可以使用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>>() {});