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必须注意的事情

在不使用混淆工具进行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 简介 示例的更多相关文章

  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. HTML&CSS基础学习笔记1.29-灵活地使用样式

    灵活的使用样式 使用样式的感觉很棒吧! 刚我们使用的内联样式是给具体的标签加上样式,如果有多个标签的时候,我们用内联样式给标签加样式的时候就需要一个个的加过来,这样就很麻烦. 而如果我们使用内部样式表 ...

  2. weekly review

    鉴于某位昔日工作在我身边的大师一直在写review,所以为了能靠近大师,我也要开始写review了. 无名师曾经说过,想要成为大师的话,要先找到一个大师,然后追随大师,再然后与大师通行,之后成为大师, ...

  3. python执行shell获取硬件参数写入mysql

    最近要获取服务器各种参数,包括cpu.内存.磁盘.型号等信息.试用了Hyperic HQ.Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy. 于是乎想到用python ...

  4. windows+linux下jdk安装及java环境变量配置

    对于初学java的用户来说,可能第一件要做的事情就是安装jdk及配置环境,以下内容主要讲述windows及linux下jdk的安装以及环境变量的配置. 1.首先下载相应平台可用版本jdk安装文件,可以 ...

  5. 【Oracle】安装

    http://www.2cto.com/database/201208/150620.html 呵呵,花了一个多小时,左右把11g安装折腾好了.其中折腾SQL Developer 花了好长时间,总算搞 ...

  6. Longest Ordered Subsequence

    http://poj.org/problem?id=2533 #include<cstdio> #include<iostream> #include<cstring&g ...

  7. DC DC降壓變換器ic 工作原理

    目前DC/DC轉化器大致可分為:升壓型dc dc變化器.降壓型dc dc變化器及可升壓又可降壓dc dc變換器.我們今天主要提一下降壓型dc dc變換器的原理: 見下圖降壓變換器原理圖如圖1所示, 當 ...

  8. POJ2513 Colored Sticks(欧拉)

    题目链接. 题目大意: 给很多木棍,两端被涂了颜色.任意两根木棍的相同颜色处可以拼接在一起,问有没有可能将所有的木棍都连起来,成一条直线? 分析: 考点,欧拉道路. 将一根木棍看成一条边,两端的颜色看 ...

  9. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  10. "红色病毒"问题 HDU 2065 递推+找循环节

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=2065 递推类题目, 可以考虑用数学方法来做, 但是明显也可以有递推思维来理解. 递推的话基本就是状态 ...