Android Json处理之Gson

概述:

项目地址:https://github.com/google/gson

Gson:java的json解析库。(其他类似的有json-lib,Jackson,fastson)

核心类:Gson或者GsonBuilder

使用jsonschema2pojo来创建POJO

1、通过网站http://www.jsonschema2pojo.org/在线创建:选择源代码类型为Json,注解类型是Gson,然后点击preview.

2、通过命令行工具:jsonschema2pojo.bat -a GSON -T JSON --source jsonaddress --target java-gen

使用Gson

你可以使用new Gson()或者通过GsonBuilder来构建Gson对象。

(Serialization)
Gson gson = new Gson();
gson.toJson(1);            ==> prints 1
gson.toJson("abcd");       ==> prints "abcd"
gson.toJson(new Long(10)); ==> prints 10
int[] values = { 1 };
gson.toJson(values);       ==> prints [1]

(Deserialization)
int one = gson.fromJson("1", int.class);
Integer one = gson.fromJson("1", Integer.class);
Long one = gson.fromJson("1", Long.class);
Boolean false = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String anotherStr = gson.fromJson("[\"abc\"]", String.class);
class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(Serialization)
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
==> json is {"value1":1,"value2":"abc"}

Note that you can not serialize objects with circular references since that will result in infinite recursion. 

(Deserialization)
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
==> obj2 is just like obj

Nested Classes (including Inner Classes)

Gson可以很容易地序列化静态static的内部类(但是非静态的这不能)

Array Examples

Gson gson = new Gson();
int[] ints = {1, 2, 3, 4, 5};
String[] strings = {"abc", "def", "ghi"};

(Serialization)
gson.toJson(ints);     ==> prints [1,2,3,4,5]
gson.toJson(strings);  ==> prints ["abc", "def", "ghi"]

(Deserialization)
int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); 

Collections Examples

Gson gson = new Gson();
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5);

(Serialization)
String json = gson.toJson(ints); ==> json is [1,2,3,4,5]

(Deserialization)
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);

Serializing and Deserializing Generic Types

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
gson.toJson(foo, fooType);
gson.fromJson(json, fooType);

Serializing and Deserializing Collection with Objects of Arbitrary Types

Sometimes you are dealing with JSON array that contains mixed types. For example:

[‘hello‘,5,{name:‘GREETINGS‘,source:‘guest‘}]

public class RawCollectionsExample {
  static class Event {
    private String name;
    private String source;
    private Event(String name, String source) {
      this.name = name;
      this.source = source;
    }
    @Override
    public String toString() {
      return String.format("(name=%s, source=%s)", name, source);
    }
  }

  @SuppressWarnings({ "unchecked", "rawtypes" })
  public static void main(String[] args) {
    Gson gson = new Gson();
    Collection collection = new ArrayList();
    collection.add("hello");
    collection.add(5);
    collection.add(new Event("GREETINGS", "guest"));
    String json = gson.toJson(collection);
    System.out.println("Using Gson.toJson() on a raw collection: " + json);
    JsonParser parser = new JsonParser();
    JsonArray array = parser.parse(json).getAsJsonArray();
    String message = gson.fromJson(array.get(0), String.class);
    int number = gson.fromJson(array.get(1), int.class);
    Event event = gson.fromJson(array.get(2), Event.class);
    System.out.printf("Using Gson.fromJson() to get: %s, %d, %s", message, number, event);
  }
}

Compact Vs. Pretty Printing for JSON Output Format

默认情况下Gson的json输出是没有空格与忽略null值得,所以不是很友好。我们可以采用pretty输出,同时输出null

Gson gson = new GsonBuilder().setPrettyPrinting().serialzeNulls().create();

NOTE: when serializing nulls with Gson, it will add a JsonNull element to the JsonElement structure. Therefore, this object can be used in custom serialization/deserialization.

Versioning Support

本文不做介绍

Excluding Fields From Serialization and Deserialization

默认情况下transient 和static field是被忽略的。但是如果你想包含某些transient域可以采取如下形式:

import java.lang.reflect.Modifier;

Gson gson = new GsonBuilder()
    .excludeFieldsWithModifiers(Modifier.STATIC)
    .create();

NOTE: you can use any number of the Modifier constants to "excludeFieldsWithModifiers" method.  For example:
Gson gson = new GsonBuilder()
    .excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT, Modifier.VOLATILE)
    .create();

不过有更好的形式可以采取@Expose注解:然后调用 new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()创建Gson凡是被@Expose注解的域都会被包括,没有被注解的都被忽略。

JSON Field Naming Support  @SerializedName

private class SomeObject {
  @SerializedName("custom_naming") private final String someField;
  private final String someOtherField;

  public SomeObject(String a, String b) {
    this.someField = a;
    this.someOtherField = b;
  }
}

SomeObject someObject = new SomeObject("first", "second");
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
String jsonRepresentation = gson.toJson(someObject);
System.out.println(jsonRepresentation);

======== OUTPUT ========
{"custom_naming":"first","SomeOtherField":"second"}

Gson2.3新的功能

New Methods in JsonArray

@TypeAdapter Annotation

JsonPath Support

参考:

https://sites.google.com/site/gson/gson-user-guide

http://www.studytrails.com/java/json/java-google-json-new-2.3.jsp

时间: 2024-10-06 18:51:29

Android Json处理之Gson的相关文章

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的好用,今天我们为了博客的保质保量,也就不分开写,我们直接拿比较火的Gson和Fast-json来使用,末尾在进行一些分析 Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 一.各有千秋 两大解析库的东家都是巨头,一个来自于Google官方,一个来自阿里巴巴,我们这

android:json解析的两个工具:Gson和Jackson的使用小例子

1.简介 json是android与服务器通信过程中常用的数据格式,例如,如下是一个json格式的字符串: {"address":"Nanjing","name":"NUPT","students":[{"name":"stu1","id":"10000","age":20},{"name"

Android应用之——谷歌官方Json解析工具Gson的使用

一.Gson简介 Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象.也就是Java对象与json字符串间的互相转换,解析. 二.使用方法 Gson的应用主要为toJson与fromJson两个转换函数,而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象.即先创建好对应的javabean,javabean中的字段与要转换的

android json解析详细介绍之gson

废话不多说,什么json是轻量级数据交换标准:自己百度去深入了解:这里有三种json解析工具.本人只用过其中两种:    1.Google Json利器之Gson   评价:简单,方便. 2.阿里巴巴 Json利器之FastJson 评价:大数据的性能还是蛮快的. 3.IBM Json利器之Json4J   少人用. 首先导入volley.jar和gson.jar的包: 在主配置文件里面加上internet权限‘ 然后就是代码: mainActivity.java public class Ma

从零开始学android开发-Json转换利器Gson之实例

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list 实体类: public class Student { private int id; private String name; private Date birthDay; public int

json解析之gson

Gson是Google的一个开源项目,可以将Java对象转换成JSON,也可能将JSON转换成Java对象. Gson里最重要的对象有2个Gson 和 GsonBuilder Gson有2个最基本的方法 1) toJson() – 转换java 对象到JSON 2) fromJson() – 转换JSON到java对象 对于泛型对象,使用fromJson(String, Type)方法来将Json对象转换成对应的泛型对象 new TypeToken<>(){}.getType()方法取得Typ

android开发笔记之Gson解析

上篇我们讲了一下的Json的解析,大家有没有发现解析一个简单的Json数据都写了这么多代码,如果是一个复杂庞大的Json数据呢,那不得写好多. 所以谷歌推出了一款Json解析神器--> Gson. 那 Gson 是用来干嘛的呢,它是用来将Json数据转换成对象,或将对象转换成Json数据.只需要导入相应 jar 包就可以. Gson下载地址:http://download.csdn.net 这次的Json数据为: {name:张三 , age:26, phone:[131,132], score

Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

Android JSON原生解析的几种思路,以天气预报为例 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家还是很有帮助的,老司机要开车了 涉及到网络,你就一定要先添加权限,准没错 <!--网络权限--> <uses-permission android:name="android.permission.INTERNET" /> 一.归属地查询(JSONObject) 这个也是最简单的一类Json

JSON格式之GSON解析

JSON格式之GSON解析 最近在做websocket相关,项目需要JSON解析.相较之下感觉google的GSON解析不错. JAVA后台 Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法 1.对象类型 采用上图的第一种方法. Gson gson =new Gson(); User user= gson.fromJson(str, User.class); 2.Map.List等 采用上图的第二种方法. Type type = new TypeToken<Ma