Gson简介

  1. 目前解析json最常用的三种工具:org.jsonJava常用的解析),fastjson(阿里巴巴出的),GsonGoogle出的),解析速度最快的是Gson
  2. Gson的全名为Google-Json,能实现Java对象和JSON之间的相互转换。Gson的特点:
    • 1)提供简单的toJson()方法和fromJson()去实现相互转换。
    • 2)可以从JSON中转换出之前存在的不可改变的对象。
    • 3)扩展提供了Java泛型。
    • 4)支持任意复杂的对象。
  3. JSON对象的key只能是string类型的, value可以是string, number, false, true, null, Object对象或者array数组, 也就是说可以存在嵌套的情况
  4. 解析JSON数据前首先必须明确待解析的是JSON Object还是JSON array
  5.  
  1.  

使用Gson必须注意的事情

  1. 在不使用混淆工具进行apk打包时(比如直接Run As…),一切正常
  2. 在使用混淆编译的方式进行apk打包时(比如Android Tools-->Export …),就不能获取到值了!
  3. 如混淆前的数据为:
  4. [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]]
  5. 混淆后的数据为:
  6. [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]]

  7. 原因是:使用GsonfromJson方法时,要求 Java Bean 中的字段名必须与服务端返回的 json 字符串中的 key 一致,才能进行解析,而混淆后, JavaBean 的类名与其字段名称全部变成了abcd等样式,这与服务端返回的 json 字符串中的 key 不一致,导致解析失败。
  8. 所以,解决的办法是:在使用混淆编译方式进行apk打包的时候,过滤掉所有相关的 JavaBean

  9. proguard.cfg文件中添加下面的代码:
  10. #Gson
  11. # Gson uses generic type information stored in a class file when working with fields. Proguard
  12. # removes such information by default, so configure it to keep all of it.
  13. -keepattributes Signature
  14. # Gson specific classes
  15. -keep class sun.misc.Unsafe { *; }
  16. #-keep class com.google.gson.stream.** { *; }
  17. # Application classes that will be serialized/deserialized over Gson
  18. -keep class com.google.gson.examples.android.model.** { *; }
  19. #滤掉某个Java Bean 文件不进行混淆编译
  20. -keep class com.lokinfo.m95xiu.bean.FamilyAssBean {*;}
  21. #滤掉某个包下的所有.class文件不进行混淆编译
  22. -keep class com.lokinfo.m95xiu.bean.** {*;}
  23.  

演示代码

  1. public class GsonTest {
  2.     public static void main(String[] args) {
  3.         objToJson();
  4.         arrayToJson();
  5.         listToJson();
  6.     }

  7.     /**json字符串和对象间的转换*/
  8.     public static void objToJson() {
  9.         Person student = new Person("包青天", "广州");
  10.         Gson gson = new Gson();
  11.         String json = gson.toJson(student);
  12.         System.out.println("json字符串 = " + json);
  13.         String jsonString = "{\"name\":\"包青天\",\"address\":\"广州\"}";
  14.         Person student2 = gson.fromJson(jsonString, Person.class);
  15.         System.out.println(student2.toString() + "\n");
  16.     }

  17.     /**json字符串和数组间的转换*/
  18.     public static void arrayToJson() {
  19.         String[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  20.         Gson gson = new Gson();
  21.         String daysJson = gson.toJson(days);
  22.         System.out.println("Json字符串 = " + daysJson);
  23.         String[] days2 = gson.fromJson(daysJson, String[].class);
  24.         for (int i = 0; i < days2.length; i++) {
  25.             System.out.print(days2[i] + " ");
  26.         }
  27.         System.out.println("\n");
  28.         //******************************************************************************************
  29.         int[][] data = { { 1, 2, 3 }, { 3, 4, 5 }, { 4, 5, 6 } };
  30.         String json = gson.toJson(data);
  31.         System.out.println("Json字符串 = " + json);
  32.         int[][] data2 = gson.fromJson(json, int[][].class);
  33.         for (int i = 0; i < data2.length; i++) {
  34.             for (int j = 0; j < data2[i].length; j++) {
  35.                 System.out.print(data2[i][j] + " ");
  36.             }
  37.             System.out.println("");
  38.         }
  39.         System.out.println("");
  40.     }

  41.     /**json字符串和集合间的转换*/
  42.     public static void listToJson() {
  43.         Map<String, String> names = new HashMap<String, String>();
  44.         names.put("Alice", "北京");
  45.         names.put("Bob", "广州");
  46.         names.put("Carol", "上海");
  47.         Gson gson = new Gson();
  48.         String jsonNames = gson.toJson(names);
  49.         System.out.println("Json字符串 = " + jsonNames);
  50.         Map<String, String> names2 = gson.fromJson(jsonNames, new TypeToken<Map<String, String>>() {
  51.         }.getType());
  52.         for (String key : names2.keySet()) {//增强for遍历健
  53.             String value = names2.get(key);
  54.             System.out.println(key + "---" + value);
  55.         }
  56.         System.out.println("");
  57.         //******************************************************************************************
  58.         List<Person> persons = new ArrayList<Person>();
  59.         persons.add(new Person("Alice", "北京"));
  60.         persons.add(new Person("Carol", "上海"));
  61.         persons.add(new Person("Bob", "广州"));
  62.         gson = new Gson();
  63.         String jsonpPerson = gson.toJson(persons);
  64.         System.out.println("Json字符串 = " + jsonpPerson);
  65.         List<Person> person2 = gson.fromJson(jsonpPerson, new TypeToken<List<Person>>() {
  66.         }.getType());
  67.         for (Person student : person2) {
  68.             System.out.println("student.getName() -- " + student.name);
  69.         }
  70.     }
  71. }
  1.  

利用Gson对Json节点解析

  1. // json 节点解析。实际中我们不可能把全部父节点都封装成JavaBean,我们只需找到自己需要的那些节点的父节点,只将此父节点转换成object
  2. public class DemoParser {
  3.     public static void main(String[] args) {
  4.         String json = "{'flag':true,'data':{'name':'张三','age':18,'address':'广州'}}";
  5.         JsonParser parser = new JsonParser();
  6.         // 获得 根节点元素
  7.         JsonElement element = parser.parse(json);
  8.         //根据【接口文档】判断根节点属于什么类型的 Json节点对象(JsonObject或JsonArray)
  9.         JsonObject root = element.getAsJsonObject();
  10.         // 取得根节点下的某个节点的值
  11.         JsonPrimitive flagJson = root.getAsJsonPrimitive("flag");
  12.         boolean flag = flagJson.getAsBoolean();
  13.         System.out.println(flag);

  14.         JsonObject dataJson = root.getAsJsonObject("data");
  15.         Person student = new Gson().fromJson(dataJson, Person.class);
  16.         System.out.println(student);
  17.     }
  18. }
  1.  

Bean

  1. public class Person {
  2.     //不要求一定有get、set方法,也不要求一定有无参构造方法,甚至不要求其成员是public还是private
  3.     //但要求所有字段名必须和json字符串中的一致
  4.     public String name;
  5.     public String address;
  6.     public Person(String name, String address) {
  7.         this.name = name;
  8.         this.address = address;
  9.     }
  10.     @Override
  11.     public String toString() {
  12.         return "name=" + name + " & " + "address=" + address;
  13.     }
  14. }
  1.  

附件列表

GSON 简介 示例的更多相关文章

  1. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  2. 【Scroller】scrollTo scrollBy startScroll computeScroll 自定义ViewPage 简介 示例

    简介 android.widget.Scroller是用于模拟scrolling行为,它是scrolling行为的一个帮助类.我们通常通过它的 startScroll 函数来设置一个 scrollin ...

  3. 加解密 3DES AES RSA 简介 示例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 补间动画 Interpolator 简介 示例

    简介 补间动画的原理: 每次绘制视图时View所在的[ViewGroup]中的drawChild函数获取该View的Animation的值,然后调用canvas.concat (transformTo ...

  5. HTTP调试 抓包 工具 Fiddle 简介 示例

    简介 1.常用抓包工具对比: Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要"无刷新修改",如果 ...

  6. C# 多线程及同步简介示例

           60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建.撤消与切换存在较大的时空开销,因此需要引入轻型进程: ...

  7. GSON速学必会

    一. GSON 简介 GSON是一个用Java语言编写的用于处理JSON数据格式的开源应用程序编程接口项目.它将Java对象转换为JSON表示.还可以用于将JSON字符串转换为等效的Java对象. g ...

  8. 除了FastJson,你还有选择: Gson简易指南

    前言 这个周末被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害可导致服务瘫痪! 刷屏,离之前漏洞事件没多久,fastjson 又出现严重 Bug.目前项目中不少使用了 fast ...

  9. Android总结之json解析(FastJson Gson 对比)

    前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...

随机推荐

  1. jquery mobile 栅格化

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. JQuery验证input

    jsp中表单如下: <form method="post" action="AddPlayer"> <div class = "on ...

  3. Codeforces 556A Case of the Zeros and Ones(消除01)

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Description Andr ...

  4. 用Javascript的for循环输出质数

    <body> <script type="text/javascript"> for(i=2;i<=300;i++){ var prime = tru ...

  5. Java 保留两位小数

    在实际项目开发中,经常会存在浮点数四舍五入保留几位小数的问题,故收集了几种常用方法: 直接上代码(保留两位小数). Format.java: import java.math.BigDecimal; ...

  6. 解决xp下无法通过windows installer服务安装此安装程序包。您必须安装带有更新版本Wi

    今天装 tortoisegit 的时候发现安装包不能使用.报错无法通过windows installer服务安装此安装程序包.您必须安装带有更新版本Windows Installer服务的Window ...

  7. 使用thumbnailator 时部分图片抛异常

    net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for source ...

  8. 使用Pull解析器生成XML文件和读取xml文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  9. Android 4.0 新增的显示数据集的桌面控件

    setRemoteAdapter (int viewId, Intent intent):该方法可以使用 Intent 更新 RemoteViews 中viewId 对应的组件. 上面方法的 Inte ...

  10. AnimationDrawable 资源

    AnimationDrawable代表一个动画,Android 既支持传统的逐帧动画(类 似于电影方式,一张图片.一张图片地切换),也支持通过平移.变换计算出来的补间动画. 下面以补间动画为例来介绍如 ...