Gson是谷歌官方提供的解析json数据的工具类。json数据的解析能够使用JSONObject和JSONArray配合使用解析数据,可是这样的原始的方法对于小数据的解析还是有作用的,可是陪到了复杂数据的解析,就非常难完毕任务。

Gson这个java类库能够把java对象转换成JSON,也能够把JSON字符串转换成一个相等的java对象。

以下我们来看一下详细的Gsom解析数据的过程。首先我们在server端定义了四种数据:各自是Person对象,List<Person>。List<String>,List<Map<String,Object>>

public class JsonService {

	public JsonService() {
// TODO Auto-generated constructor stub
} public Person getPerson(){
Person person =new Person(1001,"呆呆","成都双流");
return person; } public List<Person> getlistperson(){ List<Person> list =new ArrayList<>();
Person person1 =new Person(1001, "哈哈", "广东");
Person person2 =new Person(1002, "呵呵", "成都");
list.add(person1);
list.add(person2); return list;
} public List<String> getListString(){
List<String> list =new ArrayList<>();
list.add("北京");
list.add("成都");
list.add("双流");
return list;
} public List<Map<String, String>> getListMaps(){ List<Map<String, String>> list =new ArrayList<>();
Map<String, String> map1 =new HashMap<String, String>();
map1.put("id", "1001");
map1.put("name", "呆呆");
map1.put("address", "成都");
Map<String, String> map2 =new HashMap<String, String>();
map2.put("id", "1002");
map2.put("name", "好痒");
map2.put("address", "双流");
list.add(map1);
list.add(map2);
return list; }

知道了server上的详细数据之后。我们新建一个Androidproject,定义四个button。分别实现对Person对象。List<Person>,List<String>,List<Map<String,Object>>的解析功能。详细的xml布局代码这里就不做演示,读者自行创建。

由于Gson是使用的第三方框架,所以我们须要在project项目的lib目录下导入对应的jar文件,这里我们使用的gson-2.2.1.jar。由于从server获取数据须要用到网络,我们须要在AndroidMainfest.xml文件里获取网络请求权限:

<uses-permission android:name="android.permission.INTERNET"/>

创建对应的Person类,类中包括了id、name、address的set/get方法,以及一个tostring方法还有构造函数。具体代码不做具体描写叙述。

想要获取网络上的数据,就须要一个网络訪问类,打开网络訪问连接获取详细的数据:(若对当中某些代码有疑惑能够查看上一篇XML文件解析,有详细的代码解释这里不做赘述)

public class HttpUtils {
public HttpUtils() {
} public static String getJsonContent(String url_path) {
try {
//定义http的链接,设置链接时长为3s,使用get方法获取数据
URL url = new URL(url_path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);
connection.setRequestMethod("GET");
connection.setDoInput(true);
int code = connection.getResponseCode();
if (code == 200) {
return changeInputStrean(connection.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
} //把字符串从outputString流里面写入ByteArrayOutputStream中,转换成字节数组。在构建一个新的字符串
private static String changeInputStrean(InputStream inputStream) {
String jsonString = null;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] data = new byte[1024];
try {
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
} jsonString = new String(outputStream.toByteArray()); } catch (IOException e) {
e.printStackTrace();
}
return jsonString;
} }

全部东西准备就绪,接下来须要做的就是定义Gson的工具类了。在这里我们要明确的是server将详细的数据对象使用Gson转换成了Json字符串。那么client须要做的就是将json字符串还原成原来的对象,那么我们这里定义的Gson工具类,一定是要可以满足各种数据对象的。也就是说无论server传递什么样的对象。作为client仅仅须要知道对象的类型就行将对象还原,所以在这里我们使用了泛型T的方式来定于

public class GsonTools {

    public GsonTools() {
} //使用泛型,不须要知道server端返回的是什么对象。server端gson解析成字符串返回后。都会解析成原来的对象 /**
*
* @param jsonstring
* @param cls
* @param <T> server端的对象使用Gson解析成json字符串,client将json字符串解析还原成原来的对象,如想提取成工具
* 类,不管server端传递的是什么对象,client仅仅需知道对象类型就能够解析。因此在此使用泛型T
* @return
*/
public static <T> T getperson(String jsonstring, Class<T> cls) {
T t = null; Gson gson = new Gson();
t = gson.fromJson(jsonstring, cls); return t;
} /**
* 使用Gson进行解析List<Person>对象
* TypeToken 官方提供的反射机制,详见api说明文档
*
*
* @param jsonstring
* @param cls
* @param <T>
* @return
*/ public static <T> List<T> getpersons(String jsonstring, Class<T> cls) { List<T> list = new ArrayList<T>(); Gson gson = new Gson();
//TypeToken把对象T中属性的值通过反射机制映射出来。再从jsonstring字符串中取出来的值放进去
//TypeToken<List<T>>(){}.getType()该方法表示把jsonstring字符串里面的值取出来之后封装到list中,然后分别从T中取出全部的类型
list = gson.fromJson(jsonstring, new TypeToken<List<T>>() {
}.getType()); return list;
} public static List<String> getList(String jsonString) {
List<String> list = new ArrayList<>();
Gson gson = new Gson();
list = gson.fromJson(jsonString, new TypeToken<List<String>>() {
}.getType()); return list;
} public static List<Map<String, Object>> getlistmap(String jsonstring) { List<Map<String, Object>> list = new ArrayList<>(); Gson gson = new Gson();
list = gson.fromJson(jsonstring, new TypeToken<List<Map<String, Object>>>() {
}.getType());
return list;
}
}

剩下的事情就是我们实现详细的点击事件的功能了,由于这里使用API的版本号不支持在主线程中訪问网络请求,这里为了方便起见,我就直接定义了一个线程进行訪问。在详细的代码实现过程中,大家能够依据须要使用不同的方法:

case R.id.gsonperson:

                new Thread(){
@Override
public void run() {
String path5 ="http://192.168.199.247:8080/jsonProject1/JsonAction? action_flag=person";
String jsonstring = HttpUtils.getJsonContent(path5);
Person person = GsonTools.getperson(jsonstring,Person.class);
Log.i(TAG,person.toString());
}
}.start();
break;
case R.id.gsonpersons: new Thread(){
@Override
public void run() {
String path6 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=persons";
String jsonstring = HttpUtils.getJsonContent(path6);
List<Person> list = GsonTools.getpersons(jsonstring, Person.class);
Log.i(TAG,list.toString()); }
}.start();
break;
case R.id.gsonliststring:
new Thread(){
@Override
public void run() {
String path7 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=liststring";
String jsonstring = HttpUtils.getJsonContent(path7);
List<String> list = GsonTools.getList(jsonstring);
Log.i(TAG,list.toString());
}
}.start();
break; case R.id.gsonlistmap:
new Thread(){
@Override
public void run() {
String path8 ="http://192.168.199.247:8080/jsonProject1/JsonAction? action_flag=listmap";
String jsonstring = HttpUtils.getJsonContent(path8);
List<Map<String,Object>> list =GsonTools.getlistmap(jsonstring);
Log.i(TAG,list.toString()); }
}.start();
break; }

这里仅仅是将关键代码写出,其余代码,能够自己补充!

谢谢大家。请尊重作者的劳动成果。如需转载,请附上转载链接!

Android解析Json数据之Gson解析的更多相关文章

  1. C# JavaScriptSerializer 解析Json数据(多方法解析Json 三)

    准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...

  2. Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties

    转自:http://blog.csdn.net/ngl272/article/details/70217104 以前解析json用的惯的就是Google的gson了,用惯了基本就用它了,一直也没发现什 ...

  3. [转]Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties

    以前解析json用的惯的就是Google的gson了,用惯了基本就用它了,一直也没发现什么大问题,因为都是解析简单的json数据.但是最近学习springboot,要解析一个比较复杂的json数据.就 ...

  4. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  5. Android网络之数据解析----使用Google Gson解析Json数据

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. 我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

    1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...

  7. Android中使用Gson解析JSON数据

      Android中使用Gson解析JSON数据 在Android中可以使用Gson解析JSON数据 首先,从 code.google.com/p/google-gson/downloads/list ...

  8. Android系列---JSON数据解析

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  9. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

随机推荐

  1. Spider_Man_6 の Scrapy(未完待续)

    一:自我介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所 ...

  2. 【bzoj1415】[Noi2005]聪聪和可可 期望记忆化搜索

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  3. cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mongo:mongo-client'.

    cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element ...

  4. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  5. bzoj 4291: [PA2015]Kieszonkowe

    Description 给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和.   Input 第一行包含一个正整数n(1<=n<=1000000). 第二行包含n个正整数a_ ...

  6. 地理课(geography)

    地理课(geography) 题目描述 地理课上,老师给出了一个巨大的地图,由于世界日新月异,会有一些道路在某一时刻被删除,也会有一些道路在某一时刻被修建.这里的道路均为双向的. 老师认为,有一些城市 ...

  7. 蔬菜(vegetable)

    蔬菜(vegetable) 题目描述 题目背景:您使用脚本刷出了上题游戏 998244353 关的最高分 (最优解),心满意足的准备点继续学习,忽然一条弹窗弹了出来:你想明白活着的意义吗?你想真正的. ...

  8. caffe+Ubuntu14.04.10 +cuda7.0/7.5+CuDNNv4 安装

    特别说明: Caffe 官网地址:http://caffe.berkeleyvision.org/ 本文为作者亲自实验完成,但仅限用于学术交流使用,使用本指南造成的任何不良后果由使用者自行承担,与本文 ...

  9. 关于javascript的"+="连接符

    今天在读<javascript Dom 编程艺术>的时候,看到了自己感觉陌生的+=连接符(小白一枚,各位勿耻笑) "+="连接符,可以看成完成一次“加法和赋值”(或者“ ...

  10. 面试:ios 批量上传图片

    这几天面试,被问到关于GCD的用法,想了想,之前项目好像确实用的比较少,只是知道怎么用,有思路,但是却从来没有试过,回来之后,就尝试写了下: 封装图片上传的方法 /**批量上传图片*/ + (NSUR ...