我正在使用GSON將JSON數據轉換爲Java對象。它在我所有的測試中都能很好地工作。 問題是我們的真實對象有一些像is_online這樣的屬性。 GSON只會映射它們,如果它們命名完全相同,那麼讓GSON將名稱轉換爲Java駝峯案例isOnline會很好。使用GSON將JSON樣式屬性名稱轉換爲Java CamelCase名稱
看起來,這是可能的,同時創建JSON數據,駱駝大小寫轉換爲JSON中的下劃線分隔的單詞。但我無法找到一種方法來反過來指定這一點。
我正在使用GSON將JSON數據轉換爲Java對象。它在我所有的測試中都能很好地工作。 問題是我們的真實對象有一些像is_online這樣的屬性。 GSON只會映射它們,如果它們命名完全相同,那麼讓GSON將名稱轉換爲Java駝峯案例isOnline會很好。使用GSON將JSON樣式屬性名稱轉換爲Java CamelCase名稱
看起來,這是可能的,同時創建JSON數據,駱駝大小寫轉換爲JSON中的下劃線分隔的單詞。但我無法找到一種方法來反過來指定這一點。
請記住,你的例子是一個邊緣案例。如果你有一個屬性'foo',它的getter應該被命名爲'getFoo',並且如果你有一個名爲'foo_bar'的屬性,它的getter應該被命名爲'getFooBar',但是在你的例子中,你正在映射布爾和布爾值java中的特殊情況命名約定。名爲online的原始布爾屬性應該有一個名爲'isOnline',不'getOnline'或更糟糕的'getIsOnline'的getter。一個布爾封裝器對象(即布爾)不應該遵循這種特殊情況,名爲'online'的屬性應該有一個名爲'getOnline'的getter。
因此,在名稱中帶有'is'的布爾屬性是一種邊緣情況,您需要在轉換過程中去掉此特定前綴。在相反的方向上,你的代碼可能想要檢查json對象的原始屬性名稱以及'is_XXX'版本。
我想你想要的是here。使用註釋可以告訴GSON,mySuperCoolField實際上在JSON中被稱爲this_field_is_fun,並且它會正確地解壓縮它。至少我認爲它也適用於反序列化。
如果這不起作用,您可以使用自定義的JsonSerializer/JsonDeserializers,這很好用,但您必須更新它們以獲取類中的更改(例如添加字段時)。你失去了自動魔法。
最容易做的事情(如果第一個建議不起作用,這將是醜陋的,但非常乾淨和簡單)只需簡單命名該字段以使GSON快樂,並添加額外的存取器方法你喜歡的名字,例如
public boolean isXXX() {return this.is_XXX;}
簡單的事情就是我現在正在做的事情,它工作得很好。所有醜陋的不典型的java風格的代碼都隱藏在數據類中,沒有人會從外面看到它。但它仍然嘮叨我一點:) – Janusz 2010-09-09 14:45:30
我發現以下設置在閱讀帶有下劃線屬性的json和在我的模型中使用camelcasing時非常完美。
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
這應該是一個公認的答案。 – 2014-11-13 14:00:50
很好的答案,謝謝! @janusz,如果這些答案中的任何一條對你有幫助,請將它們標記爲「已接受的答案」。 – sufinawaz 2014-12-22 22:08:48
如果您有一個名稱包含兩個下劃線的情況,它會忽略第一個下劃線。防爆。 this_key_has__two_underscores將被轉換爲thisKeyHas_TwoUnderscores,反之亦然。關鍵點是FieldNamingPolicy,其中枚舉用小寫字母表示「小寫字母」,而此處轉換後的名稱帶有下劃線(_T)的大寫字母。 – 2016-05-13 07:44:20
可以使用SerializedName
註釋:
@SerializedName("field_name_in_json")
private final String fieldNameInJava;
注意:當您設置了FieldNamingPolicy
已經,SerializedName
將覆蓋其設置爲特定領域(很方便在特殊情況下)。
我會建議接受一個答案 – JeanValjean 2016-03-01 23:05:40