Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Json處理之Gson

Android Json處理之Gson

編輯:關於Android編程

概述:

java的json解析庫。(其他類似的有json-lib,Jackson,fastson) 核心類:Gson或者GsonBuilder

使用jsonschema2pojo來創建POJO

1、通過網站在線創建:選擇源代碼類型為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 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>(){}.getType();
Collection ints2 = gson.fromJson(json, collectionType);

Serializing and Deserializing Generic Types

Type fooType = new TypeToken>() {}.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

 







  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved