Android Gson解析复杂多重数据过程及错误排查

         最近在做天气预报的项目,需要用到多重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结果的正确解构,还有分析对象,是单个类,还是一个集合类。
    最后,学习的过程中,要尽量地去尝试,不断地思考,不要嫌简单,遇到问题,不要想着去依赖别人帮自己解决,问题千变万化,自己还得停下来想想。
    
     感谢阅读,如果不妥的地方,请指出。

猜你喜欢

转载自blog.csdn.net/jakera/article/details/69424804