2010-03-03 167 views
72

我正在使用GSON將JSON數據轉換爲Java對象。它在我所有的測試中都能很好地工作。 問題是我們的真實對象有一些像is_online這樣的屬性。 GSON只會映射它們,如果它們命名完全相同,那麼讓GSON將名稱轉換爲Java駝峯案例isOnline會很好。使用GSON將JSON樣式屬性名稱轉換爲Java CamelCase名稱

看起來,這是可能的,同時創建JSON數據,駱駝大小寫轉換爲JSON中的下劃線分隔的單詞。但我無法找到一種方法來反過來指定這一點。

+3

我會建議接受一個答案 – JeanValjean 2016-03-01 23:05:40

回答

2

請記住,你的例子是一個邊緣案例。如果你有一個屬性'foo',它的getter應該被命名爲'getFoo',並且如果你有一個名爲'foo_bar'的屬性,它的getter應該被命名爲'getFooBar',但是在你的例子中,你正在映射布爾和布爾值java中的特殊情況命名約定。名爲online的原始布爾屬性應該有一個名爲'isOnline',不'getOnline'或更糟糕的'getIsOnline'的getter。一個布爾封裝器對象(即布爾)不應該遵循這種特殊情況,名爲'online'的屬性應該有一個名爲'getOnline'的getter。

因此,在名稱中帶有'is'的布爾屬性是一種邊緣情況,您需要在轉換過程中去掉此特定前綴。在相反的方向上,你的代碼可能想要檢查json對象的原始屬性名稱以及'is_XXX'版本。

2

我想你想要的是here。使用註釋可以告訴GSON,mySuperCoolField實際上在JSON中被稱爲this_field_is_fun,並且它會正確地解壓縮它。至少我認爲它也適用於反序列化。

如果這不起作用,您可以使用自定義的JsonSerializer/JsonDeserializers,這很好用,但您必須更新它們以獲取類中的更改(例如添加字段時)。你失去了自動魔法。

最容易做的事情(如果第一個建議不起作用,這將是醜陋的,但非常乾淨和簡單)只需簡單命名該字段以使GSON快樂,並添加額外的存取器方法你喜歡的名字,例如

public boolean isXXX() {return this.is_XXX;} 
+0

簡單的事情就是我現在正在做的事情,它工作得很好。所有醜陋的不典型的java風格的代碼都隱藏在數據類中,沒有人會從外面看到它。但它仍然嘮叨我一點:) – Janusz 2010-09-09 14:45:30

206

我發現以下設置在閱讀帶有下劃線屬性的json和在我的模型中使用camelcasing時非常完美。

Gson gson = new GsonBuilder() 
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
    .create() 
+15

這應該是一個公認的答案。 – 2014-11-13 14:00:50

+2

很好的答案,謝謝! @janusz,如果這些答案中的任何一條對你有幫助,請將它們標記爲「已接受的答案」。 – sufinawaz 2014-12-22 22:08:48

+1

如果您有一個名稱包含兩個下劃線的情況,它會忽略第一個下劃線。防爆。 this_key_has__two_underscores將被轉換爲thisKeyHas_TwoUnderscores,反之亦然。關鍵點是FieldNamingPolicy,其中枚舉用小寫字母表示「小寫字母」,而此處轉換後的名稱帶有下劃線(_T)的大寫字母。 – 2016-05-13 07:44:20

62

可以使用SerializedName註釋:

@SerializedName("field_name_in_json") 
private final String fieldNameInJava; 

注意:當您設置了FieldNamingPolicy已經,SerializedName將覆蓋其設置爲特定領域(很方便在特殊情況下)。

相關問題