在Gson中,你怎么能将布尔限制为真和假(不是TrUe和fAlSe)?

时间:2016-12-29 07:43:53

标签: java gson

我不知道这是否是Gson中使用默认TypeAdapter.BOOLEAN的行为,但不仅仅是truefalse(以及字符串{{1}并且"true")将反序列化为有效的布尔值,但"false"TRUE(及其字符串版本),FALSETrue(和他们的String版本),以及FalseTrUe(以及他们的String版本),以及您想要尝试的任何大量案例。此外,由于fAlSe依赖于Java TypeAdapter,因此Boolean.parseBoolean()的某些案例错误的非空字符串变为"true"

我正在撰写false,我想只允许TypeAdaptertrue成为可接受的布尔值,但我无法弄清楚如何告诉我即将阅读的值是false还是true还是True还是TRUE,因为我只能调用tRuE,它会为所有这些返回相同的值。

有没有办法获得原始价值,以便我可以检查它是否是有效的小写形式还是我运气不好?

1 个答案:

答案 0 :(得分:1)

评论部分的小摘要。

JsonReader使用整数值来获取用于获取相应值的适配器。在不带引号的值的情况下,方法private int peekKeyword()将检查第一个字符:

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

即使IETF7159在第3点中声明,它也会接受大写字母

  

JSON值必须是对象,数组,数字或字符串,或者是其中之一      以下三个字面名称:

     

false null tr​​ue

     

文字名称必须小写。没有其他文字名称      允许的。

一旦将值视为布尔值,它将使用Boolean.parseBoolean(String s)进行转换,它忽略String的情况(如此处所预期的)

我注意到OP已在GitHub上打开an issue。让我们看看答案。

此API是一种更新的防弹证明,因此对接受的答案进行一些更改并不容易(甚至可能)