Google的GSON框架解析JSON数据

标签: google gson 框架 | 发表时间:2014-01-08 09:18 | 作者:Caoyu_google
出处:http://www.iteye.com
什么是JSON:
JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被采用的客户端和服务端交互的解决方案.
JSON对象:
JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象甚至是array数组, 也就是说可以存在嵌套的情况.
JSON数组:
JSON数组(array)以"["开始, 以"]"结束, 数组中的每一个元素可以是string, number, false, true, null, Object对象甚至是array数组, 数组间的元素使用逗号分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].
JSON数据的解析:
解析JSON数据, 首先需要明确待解析的是JSON Object还是JSON array, 然后需要确定采用哪种解析技术. android平台上一般有2种解析技术可供选择:android内置的org.json包和google的开源gson库. 以下将分别采用这两种技术解析JSON对象和JSON数组.

1.  采用android内置的org.json包解析JSON对象. 假设待解析的JSON数据为json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 其中\用于转义表达式中的双引号. 首先定义2个JavaBean:
[java] view plaincopy
package text.com.bean; 
 
public class Address { 
    private String street; 
    private String city; 
    private String country; 
 
    public Address() { 
        super(); 
    } 
 
    public Address(String street, String city, String country) { 
        super(); 
        this.street = street; 
        this.city = city; 
        this.country = country; 
    } 
 
    public String getStreet() { 
        return street; 
    } 
 
    public void setStreet(String street) { 
        this.street = street; 
    } 
 
    public String getCity() { 
        return city; 
    } 
 
    public void setCity(String city) { 
        this.city = city; 
    } 
 
    public String getCountry() { 
        return country; 
    } 
 
    public void setCountry(String country) { 
        this.country = country; 
    } 
 
    @Override 
    public String toString() { 
        return "Address [street=" + street + ", city=" + city + ", country=" 
                + country + "]"; 
    } 
 


[java] view plaincopy
package text.com.bean; 
 
public class Person { 
    private String name; 
    private int age; 
    private boolean male; 
    private Address address; 
 
    public Person() { 
        super(); 
    } 
 
    public Person(String name, int age, boolean male, Address address) { 
        super(); 
        this.name = name; 
        this.age = age; 
        this.male = male; 
        this.address = address; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public int getAge() { 
        return age; 
    } 
 
    public void setAge(int age) { 
        this.age = age; 
    } 
 
    public boolean isMale() { 
        return male; 
    } 
 
    public void setMale(boolean male) { 
        this.male = male; 
    } 
 
    public Address getAddress() { 
        return address; 
    } 
 
    public void setAddress(Address address) { 
        this.address = address; 
    } 
 
    @Override 
    public String toString() { 
        return "Person [name=" + name + ", age=" + age + ", male=" + male 
                + ", address=" + address + "]"; 
    } 
 


首先使用方法一解析代码如下:
[java] view plaincopy
JSONObject jsonObject = new JSONObject(json); 
String name = jsonObject.getString("name"); 
int age = jsonObject.getInt("age"); 
boolean male = jsonObject.getBoolean("male"); 
JSONObject addressJSON = jsonObject.getJSONObject("address"); 
String street = addressJSON.getString("street"); 
String city = addressJSON.getString("city"); 
String country = addressJSON.getString("country"); 
Address address = new Address(street, city, country); 
Person person = new Person(name, age, male, address); 
System.out.println(person); 
LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象.

2. 采用gson库解析JSON对象. 假设带解析的JSON数据是json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 首先需要到http://code.google.com/p/google-gson/下载jar包, 并将其添加到项目中. 具体的解析代码如下:
[java] view plaincopy
Gson gson = new Gson(); 
Person person = gson.fromJson(json, Person.class); 
System.out.println(person); 
LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象, 是不是很简单?

3. 采用android内置的org.json包解析JSON数组. 假设待解析的JSON数据为json = "[{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}, {\"name\":\"min\", \"age\"=20, \"male\":false, \"address\":{\"street\":\"heiShiJiao\", \"city\":\"daLian\", \"country\":\"china\"}}]", 解析代码如下:
[java] view plaincopy
List<Person> persons = new ArrayList<Person>(); 
JSONArray jsonArray = new JSONArray(json); 
for(int i = 0; i < jsonArray.length(); i++) { 
    JSONObject jsonObject = jsonArray.getJSONObject(i); 
    String name = jsonObject.getString("name"); 
    int age = jsonObject.getInt("age"); 
    boolean male = jsonObject.getBoolean("male"); 
    JSONObject addressJSON = jsonObject.getJSONObject("address"); 
    String street = addressJSON.getString("street"); 
    String city = addressJSON.getString("city"); 
    String country = addressJSON.getString("country"); 
    Address address = new Address(street, city, country); 
    Person person = new Person(name, age, male, address); 
    persons.add(person); 

System.out.println(persons); 
LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.

4. 采用gson库解析JSON数组. 待解析的JSON数据同上, 具体代码为:
[java] view plaincopy
Gson gson = new Gson(); 
Type listType = new TypeToken<List<Person>>(){}.getType(); 
List<Person> persons = gson.fromJson(json, listType); 
LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.
new TypeToken<List<Person>>(){}.getType(); 这句代码表示创建一个TypeToken的匿名子类对象, 并调用对象的getType()方法.

org.json包和gson库还有很多其他有用的API, 需要的时候可查看文档. 比如有的时候需要通过java对象或java集合和数组生成json数据上传给服务器, 当然你可以自我构造json字符串, 但会很麻烦. 这个时候就可以使用其中的有关API, 方便的完成这项工作.


测试用例:

[java] view plaincopy
package text.com; 
 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.lang.reflect.Type; 
import java.util.List; 
 
import text.com.bean.Address; 
import text.com.bean.Person; 
 
import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 
 
public class JsonTest { 
    String jsonString = ""; 
 
    public static void main(String[] args) { 
        // Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海淀区", 
        // "30号")); 
        // Person p2 = new Person("zhangsan", 12, true, new Address("北京", "海淀区", 
        // "30号")); 
        // Person p3 = new Person("zhangsan", 12, true, new Address("北京", "海淀区", 
        // "30号")); 
        // List<Person> list = new ArrayList<Person>(); 
        // list.add(p1); 
        // list.add(p2); 
        // list.add(p3); 
        // Gson gson = new Gson(); 
        // Type typeOfT = new TypeToken<List<Person>>(){}.getType(); 
        // String json = gson.toJson(list, typeOfT); 
        // System.out.println("json:"+json); 
 
        // String str = readTxtFile("D:\\cjjworkspace\\Test\\json.txt"); 
        // System.out.println("文件内容:" + str); 
         Gson gson = new Gson(); 
        // Type typeOfT = new TypeToken<List<Person>>(){}.getType(); 
        // List<Person> personList = gson.fromJson(str, typeOfT); 
 
        Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海淀区", "30号")); 
        Type typeOfT = new TypeToken<Person>(){}.getType(); 
        String str = gson.toJson(p1, typeOfT); 
        System.out.println(str); 
    } 
 
    public static String readTxtFile(String filePath) { 
        String encoding = "utf-8"; 
        StringBuilder sb = new StringBuilder(); 
        try { 
            File file = new File(filePath); 
            if (file.isFile() && file.exists()) { // 判断文件是否存在 
                InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式 
                BufferedReader bufferedReader = new BufferedReader(read); 
                String str = ""; 
                while ((str = bufferedReader.readLine()) != null) { 
                    sb.append(str); 
                } 
                read.close(); 
                return sb.toString(); 
            } else { 
                System.out.println("找不到指定的文件"); 
                return null; 
            } 
        } catch (Exception e) { 
            System.out.println("读取文件内容出错"); 
            e.printStackTrace(); 
        } 
        return sb.toString(); 
    } 

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [google gson 框架] 推荐:

Google的GSON框架解析JSON数据

- - JavaScript - Web前端 - ITeye博客
JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被采用的客户端和服务端交互的解决方案. JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔.

集成libevent,google protobuf的RPC框架

- goodman - C++博客-那谁的技术博客
chenshuo的evproto同样也是集成libevent与google protobuf的RPC框架,不过在对libevent的使用上,这里的做法与他不尽相同:. 1) 他使用了libevent自带的RPC功能, 而这里只使用到libevent对网络I/O进行的封装的最基本的功能.. eventrpc项目目前是avidya下的一个子项目,avidya项目的定位是实现一些分布式的玩具系统(比如google已经公开论文的chubby,mapreduce,GFS等),也许以后不一定能被用上,但是也要实践做一把.由于有一个好用的RPC框架是做分布式的必需品,所有首先实现eventrpc这个子项目了,以后也许还会实现其他语言的版本,如python,java..

判断字符串是否是有效json对象(java + gson )

- - 改善
已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

使用Gson实现Json和Java对象的转换

- - ITeye博客
Gson是Google的开源项目(项目主页: https://code.google.com/p/google-gson/),. Gson在线帮助文档: http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html.

JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP

- - Java译站
Java中哪个JSON库的解析速度是最快的. JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了. 我们很少会去想用到的这些JSON库到底有什么不同,但事实上它们的确是不太一样的. 因此,我们运行了一个基准测试来对常用的几个JSON库进行了测试,看看在解析不同大小的文件时哪个库的速度是最快的.

Google Cloud Messaging for Android (GCM)已推出,将取代C2DM框架

- - InfoQ cn
Google已经发布了Google Cloud Messaging for Android,该服务对已被废弃的云到端消息框架(C2DM)做出改进,取而代之的服务无配额限制、无需注册,并提供了一套更丰富的全新接口. GCM提供了在应用服务器和Android设备之间引入代理的能力,以保障两者之间可伸缩的云通信.

谷奥: Google = Google+

- 吞佛 - 谷奥聚合——谷奥主站+谷安 aggregator
在上周举办的Google Zeitgeist 2011大会上,John Battelle问Larry Page:在Google大部分的历史里,人们会想到搜索,那么Google品牌=搜索. 但在随后Google的发展史里,Google品牌会等于什么. Larry Page并未直面回答这个问题,至少没有从市场角度来回答.

PHP框架 Yaf

- Le - 开源中国社区最新软件
Yaf是一个C语言编写的PHP框架,Yaf 的特点: 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存. 更短的内存周转周期, 提高内存利用率, 降低内存占用率. 支持全局和局部两种加载规则, 方便类库共享.

Google宣布Google CDN

- way - Solidot
Google宣布了最新的帮助加快互联网速度的工具Page Speed Service,加快静态网页的载入速度,不支持动态网页. 在开发者注册该服务之后,可将网站的DNS入口记录指向Google,然后Page Speed Service从服务器上抓取内容,采用最佳的Web性能方案重写网页,通过Google在全球部署的服务器将内容展示给终端用户,加快网页载入速度.

微服务框架-基础框架

- - 人月神话的BLOG
上面一篇文章对SpringBoot框架做了一下简单验证,在文中也写到SpringBoot重点还是在单个微服务模块的开发,已经对于微服务接口开放的便捷性上,而对于微服务基础架构和管控治理层面没有太多支持. 对于微服务基础框架可以看作是微服务治理架构的核心内容,包括了对微服务模块的全生命周期管理能力,这个能力包括了微服务网关APP,DevOps,Docker和云集成,安全,负载均衡,服务注册和发现等诸多能力.