美文网首页
Android 知识点——当json传入字符串,使用Boolea

Android 知识点——当json传入字符串,使用Boolea

作者: 半寿翁 | 来源:发表于2019-11-09 22:28 被阅读0次

先扯两句

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

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

正文

    @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

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

相关文章

网友评论

      本文标题:Android 知识点——当json传入字符串,使用Boolea

      本文链接:https://www.haomeiwen.com/subject/hfcobctx.html