2016-12-29 141 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

相关问题