android中gson解析怎样防止参数确实

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中gson解析怎样防止参数确实相关的知识,希望对你有一定的参考价值。

参考技术A

最近在做天气预报的项目,需要用到多重JSON的解析,这里我选用了目前流行的,也公认是最简单易用的框架GSON来解析这个复杂的JSON,虽然在最后结果很简单,但并不意味着整个过程很简单,没有一点问题,恰恰是相反的,我是第一次学习这个GSON,虽然在网上看博客一看即知怎么操作,但是一动手,却发生问题还是有的。

首先,先上我的JSON结构:

"desc":"OK","status":1000,"data":"wendu":"15","ganmao":"昼夜温差很大,易发生感冒,请注意适当增减衣服,加强自我防护避免感冒。","forecast":["fengxiang":"南风","fengli":"微风级","high":"高温 16℃","type":"晴","low":"低温 2℃","date":"14日星期二","fengxiang":"南风","fengli":"微风级","high":"高温 16℃","type":"多云","low":"低温 4℃","date":"15日星期三","fengxiang":"南风","fengli":"微风级","high":"高温 17℃","type":"多云","low":"低温7℃","date":"16日星期四","fengxiang":"南风","fengli":"微风级","high":"高温16℃","type":"阴","low":"低温 5℃","date":"17日星期五","fengxiang":"南风","fengli":"微风级","high":"高温 19℃","type":"晴","low":"低温 5℃","date":"18日星期六"],"yesterday":"fl":"微风","fx":"南风","high":"高温 14℃","type":"晴","low":"低温 2℃","date":"13日星期一","aqi":"38","city":"北京"

在实现时,我是有进行过分层的,这里,我就忽略了……

首先,照着网上一个简单的教程,我把JAVABEAN,设置成这样:

CSDN:CODE:public class TestBean
public String desc;
public int status;
public List<Data> data;
public class  Data
public String wendu;
public String ganmao;
public List<Forecast> forecast;
public List<Yesterday> yesterday;
public String aqi;
public String city;
public class  Forecast
public String fengxiang;
public String fengli;
public String high;
public String type;
public String low;
public String date;
public class Yesterday
public String fl;
public String fx;
public String high;
public String type;
public String low;
public String date;

这里有两个点想说的,正确的是,一是成员变量名一定是跟JSON的字段完全一样的,那个没有“”的数字数据的话要用int,我一开始照着网上模仿这个,把内层的数据都用一个List<内部类名称>来表示。结果是失败的。

接着,我把代码又拆成了网上分多个类出来,每个类都加多一个getter和setter,我本着大脑想,或许上个想得过于简单,可能系统还需要重写toString方法,而且这些都是有规矩的。

如下图:



好吧,还是不行,胡打乱闯之下,回归了理性,我开始读Log,来分析其中的错误:

这里事实上只看第一个错误即可:Expected BEGIN_ARRAY but was BEGIN_OBJECT at…… data 

由最后一个我们知道要定位到data变量所对应的类中去(对着我的JSON代码来看问题),我仔细看了一下第一个类,类中我有这个

public List<Data> data

但是,事实上data里只有一个数据,也就是这里只有一个对象需要被创建。

然后,我试运行了一下,发现错误还是有,但是变了(这里很关键),这说明确实这里是有问题的。

//   public List<Forecast> forecast;//    public List<Yesterday> yesterday;

在错误中,又把错误指向Yerterday。结合一下我的JSON格式,发现,在Yesterday这里,又只有一个所以只生成一个对象,而Forecast却不止。所以又把代码改了。

public List<Forecast> forecast;public Yesterday yesterday;

实验结果是正确的,松了一口气~_-

做到这里,我还是想验证所有我不太清楚的点,第一,我改了类名,比如把内部类的名称改了,这里证明是不会有影响的,但是字段名是一定要一样的。第二,我又建了一个和开始一样的,只有极简的结构类,尝试如果没有 setter和getter有没有影响,结果是没影响的,toString也是可有可无的。

总之,只要保证对JSON结果的正确解构,还有分析对象,是单个类,还是一个集合类。

最后,学习的过程中,要尽量地去尝试,不断地思考,不要嫌简单,遇到问题,不要想着去依赖别人帮自己解决,问题千变万化,自己还得停下来想想。

感谢阅读,如果不妥的地方,请指出。

一起Talk Android吧(第三百五十八回:Gson库解析Java对象)

各位看官们,大家好,上一回中咱们说的是Android中Gson库解析JSON数据的例子,这一回中咱们介绍的例子是Gson库解析Java对象。闲话休提,言归正转。让我们一起Talk Android吧!

操作步骤

看官们,我们在本章回中将介绍如何使用Gson库解析Java对象,这里所说的解析就是把Java对象转换成JSON字符串。下面是具体的操作步骤:

  • 1.创建Java类型的对象,这里的Java类型由GsonFormat依据JSON数据自动生成;
  • 2.创建Gson对象,直接使用无参构造方法就可以;
  • 3.使用Gson对象的toJson()方法解析Java对象,访方法的返回值就是解析后的JSON数据;

示例程序

光说不练不是我们的风格,下面是具体的示例程序:

    private void JavaObjChangeToJson() 
        JsonBeanType javaObj = new JsonBeanType();
        javaObj.setId(11);
        javaObj.setName("jam");
        javaObj.setPrice(3.5);
        javaObj.setPath("a/b/c");

        List<JsonBeanType> javaObjList = new ArrayList<>();
        javaObjList.add(javaObj);
        javaObjList.add(javaObj);

        Gson gson = new Gson();
//        String jsonString = gson.toJson(javaObj);
        String jsonString = gson.toJson(javaObjList);
        Log.d(TAG, "JavaObjChangeToJson: "+jsonString.toString());
    

在上面的程序中我们使用了JavaBeanType类,这个类多次出现在前面的章回中,这里就不列出具体内容了。

我们重点看一下Gson类的toJson方法().该方法是整个解析操作的核心,该方法的参数可以是普通Java对象也可以是多个Java对象组成的list对象.因此可以把Java对象或者Java对象集合转换成JSON格式的字符串。

我们在这里就不演示程序的运行结果了,因为Java对象中的内容和解析后JSON字符串的内容完全一致。不过大家需要自己动手去操作,这样可以加深对知识的理解 。

看官们,关于Android中Gson库解析Java对象的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

以上是关于android中gson解析怎样防止参数确实的主要内容,如果未能解决你的问题,请参考以下文章

Android Gson使用入门及GsonFormat插件的使用

一文吃透Json解析工具类合集(FastJsonJacksonGson)

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

Gson解析第三方提供Json数据(天气预报,新闻等)

RxAndroid+RxJava+Gson+retrofit+okhttp初步搭建android网络请求框架

android gson可以只解析json中想要的属性吗