2016-12-29 54 views
0

我不知道這是在GSON使用默認TypeAdapter.BOOLEAN預期的行爲與否,而不是隻做truefalse(以及絃樂"true""false")反序列化時是有效的布爾值,但這樣做TRUEFALSE(和他們的字符串版本),TrueFalse(及其字符串版本)和TrUefAlSe(及其字符串版本),以及任何想要嘗試的案例。另外,因爲TypeAdapter依賴於Java的Boolean.parseBoolean(),所以非空字符串"true"變成false在Gson中,如何將布爾值限制爲true和false(而不是TrUe和fAlSe)?

我正在寫一個TypeAdapter,我想只允許truefalse是可以接受的布爾值,但我無法弄清楚如何判斷價值,我要讀的是trueTrueTRUEtRuE,因爲我只能撥打nextBoolean(),它會爲所有這些返回相同的值。

是否有任何方法獲取原始值,以便我可以檢查它是否是有效的小寫格式或我是否運氣不好?

+1

爲什麼你叫一些變化'nextBoolean()'如果下一個對象是String ?你不能得到字符串,並制定邏輯? – lubilis

+0

默認的'TypeAdapter.BOOLEAN'接受一個裸的,不加引號的值或一個String(顯然是爲了向後兼容)。如果我沒有引用該值並且放入'true'或'TRUE'或'True'或'tRuE','JsonReader.peek()'返回'JsonToken.BOOLEAN',我只能調用'nextBoolean()'來獲得價值。試圖調用'nextString()'會引發異常。換句話說,我無法想出一個不接受奇怪裝箱布爾人的方法。 – TOB

+0

當然,我可以爲布爾編寫我自己的'TypeAdapter'。我必須實現'public Boolean read(JsonReader in)'。我的問題是'JsonReader'沒有提供任何公開的方式來區分'true'和'TRUE'之間的區別,並且由於這是我在編寫'TypeAdapter'時唯一可以訪問的東西,所以我無法區分它們之間的區別它們之間。 – TOB

回答

0

評論部分的小結。

JsonReader使用整數值來獲取適配器以獲取相應的值。在引號值的情況下,該方法private int peekKeyword()將檢查的第一個字符是這樣的:

if(c == 't' || c == 'T') -> BOOLEAN 
if(c == 'f' || c == 'F') -> BOOLEAN 
if(c == 'n' || c == 'N') -> NULL 

所以它接受大寫即使在3點

一個JSON值必須IETF7159狀態是一個對象,數組編號,或串,或一個 以下三個文字名稱:

假空真

的文字名稱MU ST小寫。沒有其他文字名稱是允許的 。

一旦值被看作是一個布爾值,它會使用Boolean.parseBoolean(字符串或多個),其中忽略了字符串的情況下(如這裏預期)

轉換我注意到,OP具有開放an issue在GitHub上。讓我們看看答案。

這個API是一種防彈的更新所以這不會是容易的(甚至可能)做在接受答案

+0

接受這個答案,因爲它基本上說「不」,我認爲這是正確的答案。 – TOB

相關問題