2015-10-25 44 views
1

我用RestTemplate調用一些第3方API和RestTemplate將接收到的JSON自動轉換成Java POJO是這樣的:爲不同結構中的每個JSON響應創建POJO?

Result result = restTemplate.getForObject(url, Result.class); 

但有時JSON結構相當簡單,如兩個例子:

{"access_token":"abcdefg","expires_in":7200} //only need access_token 

{"status":0,"result":{"x":25,"y":46}} //only need "x" and "y" 

我應該建立在不同結構的每一個JSON響應的POJO?

例如,POJO第一個JSON結構:

public class TokenResult { 
    private String access_token; 
    private String expires_in; 

    /* Getters and Setters */ 
    ...... 
} 

對於第二個JSON結構:

public class CoordResult { 
    private String status; 
    private Coordinate result; 

    /* Getters and Setters */ 
    ...... 
} 

public class Coordinate { 
    private String x; 
    private String y; 

    /* Getters and Setters */ 
    ...... 
} 

我不認爲這是優雅的這樣做,因爲有些JSON結構非常簡單,有些僅像「access_token」響應一樣使用。

如何避免太多簡單的POJO任何想法?

+0

如果你正在尋找優雅,Java很少是最好的語言。然而,簡單的類沒有明顯的缺點,它們可以在以後發展到不僅僅是簡單的類。 – Kayaman

回答

1

你的例子中有完美的罰款。即使它覺得你有太多的POJO與財產成員不使用這個國際海事組織是最好的和未來的證明辦法。想象一下,在不久的將來,你需要實現需要訪問TokenResult.getExpiresIn()的功能,這意味着你仍然會重構基本的POJO並添加該方法和類成員。

CoordResult的類似示例中,我將status看作是一個非常重要的屬性,需要在收到響應後進行檢查,以便將它映射到POJO中的類成員是非常好的主意。

這將會使你的代碼更具彈性,並預測具有明確的結構和封裝從響應的全部信息。

但如果你有類似反應的背景和結構方面可以隨時擴展基本POJO和相關的類成員添加到子類。

另一個好處是,這一切都使得客戶端代碼易於閱讀,我們可以告訴我們從響應對象,並期望能夠在不同的實現其可能不適用,可見許多現在可以使用。

如果您決定不需要JSON響應的所有屬性,那麼仍然可以在該類上使用@JsonIgnoreProperties註釋,它將從JSON映射中排除任何未知元素。

EX:

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class TokenResult { 
    private String access_token; 

    // you don't need this 
    // private String expires_in; 
} 
+0

@JsonIgnorePropeties真的很有用。我意識到泛型是使POJO更加靈活的好方法(例如,'CoordResult'可以更改爲'BaseResult ') – JasonZhao

-1

如果你正在尋找的只是一些值從響應你可以嘗試org.json包(http://www.json.org/javadoc/)。它具有訪問JSON響應中的值的方法。

String jsonStr = "{\"access_token\":\"abcdefg\",\"expires_in\":7200}"; 
String accessToken = new JSONObject(jsonStr).getString("access_token"); 

這種方法在試圖嵌套值時會變得更加棘手。

+0

您如何從RestTemplate獲得您的建議? –