Android 知识点——当json传入字符串,使用Boolean接收时,GSON会将其转换为false

先扯两句

写代码吗,大多数情况下还是追求个准确性,可老头子我却总想着玩的邪的(总不能说是与后台约定好了接口文档,结果他们没按格式传吧,会挨揍的)。怎么判断boolean的都是false,抓一下接口
愤怒
经过我们友善的沟通,以及付出了两根排骨的代价后,终于成功让后台改了接口,不过还是有所收获的,那就是知道了Gson将String转换为boolean时是不会报错的,特此记录一下。

下面给大家展示个神器,叫Android知识点——目录,好了,闲言少叙,下面进入正题。

正文

	@Test
    public void jsonTest() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("aBoolean", true);
            jsonObject.put("string", "hasController");

            MyChange change = new Gson().fromJson(jsonObject.toString(), MyChange.class);
            System.out.println("转换成功   aBoolean = " + change.aBoolean + " ******* string = " + change.string);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public class MyChange {
        boolean aBoolean;
        boolean string = true;
    }

可以看到我们用于接收的对象为MyChange,其中的参数 string赋予默认值true,但是在创建的JSONObject 对象中,传入的string,确实“hasController”,一个纯种的字符串。通过Gson转换后,并没有想象中的报出JSONException,反而能够正常输出结果:
结果
有了这个尝试,是不是可以多玩点好玩的呢?

	@Test
    public void jsonTest() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("aBoolean", true);
            jsonObject.put("string", "hasController");
            jsonObject.put("int0", 0);

            MyChange change = new Gson().fromJson(jsonObject.toString(), MyChange.class);
            System.out.println("转换成功   \n****************************\naBoolean = " + change.aBoolean
                    + " \nstring = " + change.string
                    + " \nint0 = " + change.int0
                    + "\n****************************");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public class MyChange {
        boolean aBoolean;
        boolean string = true;
        boolean int0 = true;
    }

可惜很遗憾,这次Gson竟然失败了~~~
失败
文字翻译过来就是老子想要bean,你却给老子个NUMBER(别问我为什么用“老子”,没看人家已经大写了吗),之后又若若的试了一下long,得到的还是相同的结果,一片血红啊!
但是,这就想吓退老头子我吗?那是不可能的,别的不行,但是作死的道路上,必须有我的大脚印,于是就有了这段代码:

	@Test
    public void jsonTest() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("aBoolean", true);
            jsonObject.put("string", "hasController");
            jsonObject.put("param", new Param());

            MyChange change = new Gson().fromJson(jsonObject.toString(), MyChange.class);
            System.out.println("转换成功   \n****************************\naBoolean = " + change.aBoolean
                    + " \nstring = " + change.string
                    + " \nparam = " + change.param
                    + "\n****************************");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public class MyChange {
        boolean aBoolean;
        boolean string = true;
        boolean param = true;
    }

    private class Param {

    }

直接上最负责的java对象试试会是什么结果。
成功了

结论

经测试,除数值的基本类型,其他的类型转换为boolean不会报错,但是都会被转换为false。

PS:如果熟悉Android Junit的朋友可能已经看出来了,这里使用的代码单元测试工具正式Junit中的java test工具,但是如果直接复制代码在自己的Junit中跑很可能会看到如下错误:
在这里插入图片描述
解决这个问题可以查看:Android 知识点——Method put in org.json.JSONObject not mocked

鸣谢:图片提供网站沙沙野

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值