GSON 简介 示例
Gson简介
目前解析json最常用的三种工具:org.json(Java常用的解析),fastjson(阿里巴巴出的),Gson(Google出的),解析速度最快的是Gson。Gson的全名为Google-Json,能实现Java对象和JSON之间的相互转换。Gson的特点:
- 1)提供简单的toJson()方法和fromJson()去实现相互转换。
- 2)可以从JSON中转换出之前存在的不可改变的对象。
- 3)扩展提供了Java泛型。
- 4)支持任意复杂的对象。
JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象或者array数组, 也就是说可以存在嵌套的情况解析JSON数据前首先必须明确待解析的是JSON Object还是JSON array。Gson的jar包或库可以通过 https://github.com/google/gson 或 http://download.csdn.net/detail/zxyyxzzxy004/8206489 下载。
使用Gson必须注意的事情
在不使用混淆工具进行apk打包时(比如直接Run As…),一切正常在使用混淆编译的方式进行apk打包时(比如Android Tools-->Export …),就不能获取到值了!如混淆前的数据为:[FamilyAssBean [id=dvip_7, name=钻石VIP7天, total=3, num=3, limitNum=1, users=[], getClass()=class com.lokinfo.m95xiu.bean.FamilyAssBean, hashCode()=211434389, toString()=com.lokinfo.m95xiu.bean.FamilyAssBean@c9a3b95]]混淆后的数据为:[FamilyAssBean [id=null, name=null, total=0, num=0, limitNum=0, users=null, getClass()=class com.lokinfo.m95xiu.c.r, hashCode()=11450174, toString()=com.lokinfo.m95xiu.c.r@aeb73e]]原因是:使用Gson的fromJson方法时,要求 Java Bean 中的字段名必须与服务端返回的 json 字符串中的 key 一致,才能进行解析,而混淆后, JavaBean 的类名与其字段名称全部变成了a、b、c、d等样式,这与服务端返回的 json 字符串中的 key 不一致,导致解析失败。所以,解决的办法是:在使用混淆编译方式进行apk打包的时候,过滤掉所有相关的 JavaBean 。在proguard.cfg文件中添加下面的代码:#Gson# Gson uses generic type information stored in a class file when working with fields. Proguard# removes such information by default, so configure it to keep all of it.-keepattributes Signature# Gson specific classes-keep class sun.misc.Unsafe { *; }#-keep class com.google.gson.stream.** { *; }# Application classes that will be serialized/deserialized over Gson-keep class com.google.gson.examples.android.model.** { *; }#滤掉某个Java Bean 文件不进行混淆编译-keep class com.lokinfo.m95xiu.bean.FamilyAssBean {*;}#滤掉某个包下的所有.class文件不进行混淆编译-keep class com.lokinfo.m95xiu.bean.** {*;}
演示代码
public class GsonTest {
public static void main(String[] args) {
objToJson();
arrayToJson();
listToJson();
}
/**json字符串和对象间的转换*/
public static void objToJson() {
Person student = new Person("包青天", "广州");
Gson gson = new Gson();
String json = gson.toJson(student);
System.out.println("json字符串 = " + json);
String jsonString = "{\"name\":\"包青天\",\"address\":\"广州\"}";
Person student2 = gson.fromJson(jsonString, Person.class);
System.out.println(student2.toString() + "\n");
}
/**json字符串和数组间的转换*/
public static void arrayToJson() {
String[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
Gson gson = new Gson();
String daysJson = gson.toJson(days);
System.out.println("Json字符串 = " + daysJson);
String[] days2 = gson.fromJson(daysJson, String[].class);
for (int i = 0; i < days2.length; i++) {
System.out.print(days2[i] + " ");
}
System.out.println("\n");
//******************************************************************************************
int[][] data = { { 1, 2, 3 }, { 3, 4, 5 }, { 4, 5, 6 } };
String json = gson.toJson(data);
System.out.println("Json字符串 = " + json);
int[][] data2 = gson.fromJson(json, int[][].class);
for (int i = 0; i < data2.length; i++) {
for (int j = 0; j < data2[i].length; j++) {
System.out.print(data2[i][j] + " ");
}
System.out.println("");
}
System.out.println("");
}
/**json字符串和集合间的转换*/
public static void listToJson() {
Map<String, String> names = new HashMap<String, String>();
names.put("Alice", "北京");
names.put("Bob", "广州");
names.put("Carol", "上海");
Gson gson = new Gson();
String jsonNames = gson.toJson(names);
System.out.println("Json字符串 = " + jsonNames);
Map<String, String> names2 = gson.fromJson(jsonNames, new TypeToken<Map<String, String>>() {
}.getType());
for (String key : names2.keySet()) {//增强for遍历健
String value = names2.get(key);
System.out.println(key + "---" + value);
}
System.out.println("");
//******************************************************************************************
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("Alice", "北京"));
persons.add(new Person("Carol", "上海"));
persons.add(new Person("Bob", "广州"));
gson = new Gson();
String jsonpPerson = gson.toJson(persons);
System.out.println("Json字符串 = " + jsonpPerson);
List<Person> person2 = gson.fromJson(jsonpPerson, new TypeToken<List<Person>>() {
}.getType());
for (Person student : person2) {
System.out.println("student.getName() -- " + student.name);
}
}
}
利用Gson对Json节点解析
// json 节点解析。实际中我们不可能把全部父节点都封装成JavaBean,我们只需找到自己需要的那些节点的父节点,只将此父节点转换成object
public class DemoParser {
public static void main(String[] args) {
String json = "{'flag':true,'data':{'name':'张三','age':18,'address':'广州'}}";
JsonParser parser = new JsonParser();
// 获得 根节点元素
JsonElement element = parser.parse(json);
//根据【接口文档】判断根节点属于什么类型的 Json节点对象(JsonObject或JsonArray)
JsonObject root = element.getAsJsonObject();
// 取得根节点下的某个节点的值
JsonPrimitive flagJson = root.getAsJsonPrimitive("flag");
boolean flag = flagJson.getAsBoolean();
System.out.println(flag);
JsonObject dataJson = root.getAsJsonObject("data");
Person student = new Gson().fromJson(dataJson, Person.class);
System.out.println(student);
}
}
Bean
public class Person {
//不要求一定有get、set方法,也不要求一定有无参构造方法,甚至不要求其成员是public还是private
//但要求所有字段名必须和json字符串中的一致
public String name;
public String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "name=" + name + " & " + "address=" + address;
}
}
附件列表
GSON 简介 示例的更多相关文章
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...
- 【Scroller】scrollTo scrollBy startScroll computeScroll 自定义ViewPage 简介 示例
简介 android.widget.Scroller是用于模拟scrolling行为,它是scrolling行为的一个帮助类.我们通常通过它的 startScroll 函数来设置一个 scrollin ...
- 加解密 3DES AES RSA 简介 示例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 补间动画 Interpolator 简介 示例
简介 补间动画的原理: 每次绘制视图时View所在的[ViewGroup]中的drawChild函数获取该View的Animation的值,然后调用canvas.concat (transformTo ...
- HTTP调试 抓包 工具 Fiddle 简介 示例
简介 1.常用抓包工具对比: Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要"无刷新修改",如果 ...
- C# 多线程及同步简介示例
60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建.撤消与切换存在较大的时空开销,因此需要引入轻型进程: ...
- GSON速学必会
一. GSON 简介 GSON是一个用Java语言编写的用于处理JSON数据格式的开源应用程序编程接口项目.它将Java对象转换为JSON表示.还可以用于将JSON字符串转换为等效的Java对象. g ...
- 除了FastJson,你还有选择: Gson简易指南
前言 这个周末被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害可导致服务瘫痪! 刷屏,离之前漏洞事件没多久,fastjson 又出现严重 Bug.目前项目中不少使用了 fast ...
- Android总结之json解析(FastJson Gson 对比)
前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...
随机推荐
- 九度OJ 1025 最大报销额(01背包)
题目1025:最大报销额 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2683 解决:608 题目描述: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具( ...
- Adb shell 常用命令
1. 查看IP adb shell netcfg 2. 查看挂载设备 adb devices 3. 将本地端口转发至手机端口 adb forward tcp: tcp: // PC上所有6100端口通 ...
- 去掉所有的html标签
去掉所有的HTML标签:$text=preg_replace('/<[^>]+>/','',$text); 去掉<img>标签:$text=preg_replace('/ ...
- 扩展PHP内置的异常处理类
在try代码块中,需要使用throw语句抛出一个异常对象,才能跳到转到catch代码块中执行,并在catch代码块中捕获并使用这个异常类的对象.虽然在PHP中提供的内置异常处理类Exception,已 ...
- 封装好的PHP分页类,简单好用--在开源看到的,取回来自己用
class Pagination 独立分页类 调用方式: $pagenation = new Pagination( 4, 10, 200 ); // 4(第一个参数) = currentPage, ...
- storm接入metaq时类不兼容错误 无法初始化MonitorLog
在实际的项目中,需要storm从metaq中读取数据,一开始就有日志问题,查到是storm/lib中的log4j-over-slf4j和slf4j-api.jar包的不兼容导致的,这些日志包使用时必须 ...
- ubuntu 的远程桌面
好久没有弄ubuntu 丢人的啊,先安装了个服务器版,发现好多命令都忘记了,命令行下根本搞不懂 又安装了个桌面版...但是服务器远程么,putty还是搞的头大,又乱码,有各种文件传输. 还好记得以前用 ...
- [转]解读ASP.NET 5 & MVC6系列(7):依赖注入
本文转自:http://www.cnblogs.com/TomXu/p/4496440.html 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Inject ...
- 软硬大比拼 硅胶、TPU和PC材质对比
手机保护壳的材质有很多种,目前保护壳市场上最为常见的就是硅胶.TPU.PC材质了.那么我们不禁要问,PU.硅胶.PC三材质到底有哪些区别呢?普通消费者在购买保护壳的时候能否从外表就能看出保护壳材质?P ...
- <frameset><frame><iframe>网页框架
这几个标签都属于同一类功能,就是框架内镶功能: 1)<frameset>意为把页面分解成一定部分,让每一部分显示不同的内镶框架,如(请复制到DW尝试): <html> < ...