Gson解析Json实例
来源:互联网 发布:唐氏筛查自动计算软件 编辑:程序博客网 时间:2024/05/22 06:25
研究GSON花费了我一天的时间,期间出现了各种问题,第一次可以理解嘛,不过还好在安卓开发交流22群几位大神的帮助和我极大的耐心一下终于搞出来了,多谢几位大神,这里体现出了技术交流的重要性,一个人不可能所有技术都精通,懂得share,你的学识才能发扬光大,哈哈。下面进入一些理论知识:
一、Json理论知识
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率.
从结构上看,所有的数据(data)最终都可以分解成三种类型:
第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。
第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。
第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。
1) 并列的数据之间用逗号(",")分隔。
2) 映射用冒号(":")表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号("{}")表示。
我们以http://apistore.baidu.com/astore/serviceinfo/2003.html为例,官方给出的json数据如下例:
二、Json实例
JSON返回示例:{ "errNum": 0, "errMsg": "success", "retData": { "from": "en", "to": "zh", "dict_result": { "word_name": "hello", "symbols": [ { "ph_am": "hɛˈlo, hə-", "ph_en": "hə'ləʊ", "parts": [ { "part": "int.", "means": [ "哈喽,喂", "你好,您好", "表示问候", "打招呼" ] }, { "part": "n.", "means": [ "“喂”的招呼声或问候声" ] }, { "part": "vi.", "means": [ "喊“喂”" ] } ] } ] } }}
看起来比较蛋疼吧,这玩意估计你用原始的JSONObject和JSONArray解析会让你蛋碎而且不利于以后维护,所以没办法,研究一下更科学的办法吧。
首先我们要定义bean:
分析一下有多少层:
最后一层是个字符串数组,就不要写bean了,所以应该有五个。这里要注意哪个是对象,哪个是数组,不然肯定会报错:
类似这种啊,提示IllegalStateException,话说怎么区分哪个是对象,哪个是数组呢?就这么理解打箭头的这些元素后面直接跟“[”(中括号)的就是数组,当然不直接跟中括号的就是对象,再定义bean的时候就有不同了,具体看下面的代码:
第一个bean:
package org.lxh.demo;import java.util.List;public class Status1 {private int errNum;private String errMsg;RetData2 retData;//保证变量名与返回JSON的标签名一致,注意!!!!!!!!@Overridepublic String toString() {return "Status [errNum=" + errNum + ", errMsg=" + errMsg + ", retData="+ retData + "]";}public int getErrNum() {return errNum;}public void setErrNum(int errNum) {this.errNum = errNum;}public String getErrMsg() {return errMsg;}public void setErrMsg(String errMsg) {this.errMsg = errMsg;}public RetData2 getRetData() {return retData;}public void setRetData(RetData2 retData) {this.retData = retData;}}
第二个bean:
package org.lxh.demo;import java.util.List;public class RetData2 {private String from;private String to;DictResult3 dict_result;public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public DictResult3 getDictResult() {return dict_result;}public void setDictResult(DictResult3 dictResult) {this.dict_result = dictResult;}@Overridepublic String toString() {return "RetData [from=" + from + ", to=" + to + ", dictResult="+ dict_result + "]";}}
第3个bean:
package org.lxh.demo;import java.util.List;public class DictResult3 {private String word_name;private List<Symbols> symbols;public String getWord_name() {return word_name;}public void setWord_name(String word_name) {this.word_name = word_name;}public List<Symbols> getSymbols() {return symbols;}public void setSymbols(List<Symbols> symbols) {this.symbols = symbols;}@Overridepublic String toString() {return "DictResult [word_name=" + word_name + ", symbols=" + symbols+ "]";}}
第4个bean:
package org.lxh.demo;import java.util.List;public class Symbols {private String ph_am;private String ph_en;private List<Parts> parts;public String getPh_am() {return ph_am;}public void setPh_am(String ph_am) {this.ph_am = ph_am;}public String getPh_en() {return ph_en;}public void setPh_en(String ph_en) {this.ph_en = ph_en;}public List<Parts> getParts() {return parts;}public void setParts(List<Parts> parts) {this.parts = parts;}@Overridepublic String toString() {return "Symbols [ph_am=" + ph_am + ", ph_en=" + ph_en + ", parts="+ parts + "]";}}
第5个:
package org.lxh.demo;import java.util.Arrays;import java.util.List;public class Parts {private String part;public String getParts() {return part;}public void setParts(String parts) {this.part = parts;}public String[] getMeans() {return means;}public void setMeans(String[] means) {this.means = means;}@Overridepublic String toString() {return "Parts [parts=" + part + ", means=" + Arrays.toString(means)+ "]";}String[] means;}
以上写bean的时候又快捷方式,你不会不知道吧,你要是一个一个打,会把你累傻,什么快捷方式呢?比如第一个bean:
我们只要写:
private int errNum;
private String errMsg;
RetData2 retData;
这三行,然后选中他们点右键,选择Source 然后你就看到.....getter和setter方法,和什么什么tostring()了吧,这些都是可以帮你自动生成的。
上面写bean时最最重要的地方就是,定义的变量名,对象名和数组名一定要和json数据里的标签一模一样,不然一会解析数据的时候会因为找不到标签而返回null,那不就白忙活了。
接下面就是MainActivity了。
package org.lxh.demo;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.StringRequest;import com.android.volley.toolbox.Volley;import com.google.gson.Gson;public class MainActivity extends Activity {private Button tojson;RequestQueue mQueue;StringRequest stringRequest;Gson gson;String str;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);tojson = (Button) findViewById(R.id.toJson);gson = new Gson();mQueue = Volley.newRequestQueue(MainActivity.this);// http://10.19.20.12/upgrade/test.txt是测试使用的json数据stringRequest = new StringRequest("http://apistore.baidu.com/microservice/dictionary?query=hello&from=en&to=zh",new Response.Listener<String>() {public void onResponse(String response) {Log.d("TAG", response);System.out.println("response=" + response);Status1 status = gson.fromJson(response, Status1.class);System.out.println("错误码:" + status.getErrNum());System.out.println("错误信息" + status.getErrMsg());System.out.println("status=" + status);System.out.println("-------------------------------------");RetData2 retData2 = status.getRetData();System.out.println("from=" + retData2.getFrom());DictResult3 dictResult3;dictResult3 = retData2.getDictResult();System.out.println("word_name="+ dictResult3.getWord_name());}}, new Response.ErrorListener() {public void onErrorResponse(VolleyError error) {Log.e("TAG", error.getMessage(), error);}});tojson.setOnClickListener(new OnClickListener() {public void onClick(View v) {mQueue.add(stringRequest);}});}}
运行一下实例:看log窗口:
注释:只是象征性的取了几个数啊,没有全部取出来,只是讲一下方法,你要那些数据,自己按照这个方法解析就好了。好了上面你还看到用到了Volley类,那么什么是Volley?
这里也顺便介绍一下吧:(下面介绍的文字是参考的)
三、Volley理论知识
我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
四、怎么用Volley
首先要下载一个jar包:
看名字百度下载吧。然后把包导进去,怎么导进去?百度吧,应该不难。
直接看代码你就知道怎么用了:
package org.lxh.demo;import android.app.Activity;import android.os.Bundle;import android.util.Log;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.StringRequest;import com.android.volley.toolbox.Volley;public class Hello extends Activity { public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); // 生命周期方法super.setContentView(R.layout.main); // 设置要使用的布局管理器RequestQueue mQueue = Volley.newRequestQueue(Hello.this); //获取一个RequestQueue对象StringRequest stringRequest = new StringRequest("http://www.baidu.com", //创建一个StringRequest对象 new Response.Listener<String>() { public void onResponse(String response) { Log.d("TAG", response); } }, new Response.ErrorListener() { public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } }); mQueue.add(stringRequest); // 将这个StringRequest对象添加到RequestQueue里面}}
运行实例看Log窗口:
返回的就是一个百度的Html数据。上面代码你就懂得了怎么获取Json数据的吧。
源码:http://download.csdn.net/detail/yayun0516/8713279
应用下载地址:
http://openbox.mobilem.360.cn/index/d/sid/2966005
http://android.myapp.com/myapp/detail.htm?apkName=com.yayun.gitlearning
欢迎下载,有问题多交流!(喜欢的请关注我,谢谢!)
- Gson解析Json实例
- Gson解析 json 实例
- Gson解析JSON数据实例
- google-gson解析json数据---小实例
- Google Gson解析Json数据应用实例
- Google Gson解析Json数据应用实例
- 用gson分析解析json实例
- JSON解析 GSON解析
- json解析:gson解析json
- Gson解析Json数据
- 使用Gson解析Json
- Android JSON Gson 解析
- 使用Gson解析json
- Gson解析json
- Gson解析Json数据
- 使用Gson解析json
- Gson解析Json步骤
- Gson解析Json
- 设计模式C++实现十八:桥接模式
- JAVA JNI Demo
- 径向基核函数 (Radial Basis Function)--RBF
- 改变word的语言字典
- MyAlertViewActionSheet
- Gson解析Json实例
- IIS的各种身份验证详细测试
- Java回忆录(一)-------邂逅
- android客户端和java服务端之间用socket来传输图片(示例代码)
- 数据结构—数组实现两个栈,不上溢
- CDN架构实践:LVS 和keepalived 配置实例
- android ViewPager动画的实现原理及效果
- 深入了解Java运行时的内存区域
- android network 整理计划