編輯:關於Android編程
上篇文章gson用戶指南(上)翻譯到了10、序列化和反序列化有任意類型對象的collection
我們繼續
java.net.URL to match it with strings like "https://github.com/google/gson/" java.net.URI to match it with strings like "/google/gson/"你可以從源碼中找到一些常用的類。例如JodaTime點擊打開鏈接
GsonBuilder gson = new GsonBuilder(); gson.registerTypeAdapter(MyType2.class, new MyTypeAdapter()); gson.registerTypeAdapter(MyType.class, new MySerializer()); gson.registerTypeAdapter(MyType.class, new MyDeserializer()); gson.registerTypeAdapter(MyType.class, new MyInstanceCreator());registerTypeAdapter調用檢查類型適配器實現一個以上的接口,注冊它。
private class DateTimeSerializer implements JsonSerializer當它運行到一個DateTime對象序列化時。Gson會調用serialize()。{ public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src.toString()); } }
private class DateTimeDeserializer implements JsonDeserializer當需要一個JSON字符串反序列化{ public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { return new DateTime(json.getAsJsonPrimitive().getAsString()); } }
private class MoneyInstanceCreator implements InstanceCreatorType 可以是相應的泛型 調用構造函數需要特定的泛型類型信息{ public Money createInstance(Type type) { return new Money("1000000", CurrencyCode.USD); } }
class MyList然而,有時你需要根據實際參數化類型創建實例。這種情況下,可以使用傳遞到createInstance方法的類型參數,例如extends ArrayList { } class MyListInstanceCreator implements InstanceCreator > { @SuppressWarnings("unchecked") public MyList createInstance(Type type) { // No need to use a parameterized list since the actual instance will have the raw type anyway. return new MyList(); } }
public class Id在上面的示例中,如果沒有傳遞參數化類型的真實類型,不能創建Id類的實例。我們通過方法參數傳遞類型type來解決這個問題。在本例中Java對象是類型參數化的類型表示的Id < Foo >應該綁定到實例Id < Foo >。由於Id類只有一個參數化的類型參數T,我們使用getActualTypeArgument()返回的第0個元素類型的數組將持有Foo.class{ private final Class classOfId; private final long value; public Id(Class classOfId, long value) { this.classOfId = classOfId; this.value = value; } } class IdInstanceCreator implements InstanceCreator > { public Id createInstance(Type type) { Type[] typeParameters = ((ParameterizedType)type).getActualTypeArguments(); Type idType = typeParameters[0]; // Id has only one parameterized type T return Id.get((Class)idType, 0L); } }
Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonOutput = gson.toJson(someObject);
Gson gson = new GsonBuilder().serializeNulls().create();注意,當使用Gson序列化null對象時,會在JsonElement 結構中增加JsonNull ,這個對象不能用於自定義序列化反序列化 示例
public class Foo { private final String s; private final int i; public Foo() { this(null, 5); } public Foo(String s, int i) { this.s = s; this.i = i; } } Gson gson = new GsonBuilder().serializeNulls().create(); Foo foo = new Foo(); String json = gson.toJson(foo); System.out.println(json); json = gson.toJson(null); System.out.println(json);輸出
{"s":null,"i":5} null
public class VersionedClass { @Since(1.1) private final String newerField; @Since(1.0) private final String newField; private final String field; public VersionedClass() { this.newerField = "newer"; this.newField = "new"; this.field = "old"; } } VersionedClass versionedObject = new VersionedClass(); Gson gson = new GsonBuilder().setVersion(1.0).create(); String jsonOutput = gson.toJson(someObject); System.out.println(jsonOutput); System.out.println(); gson = new Gson(); jsonOutput = gson.toJson(someObject); System.out.println(jsonOutput);
{"newField":"new","field":"old"} {"newerField":"newer","newField":"new","field":"old"}
import java.lang.reflect.Modifier; Gson gson = new GsonBuilder() .excludeFieldsWithModifiers(Modifier.STATIC) .create();可以添加多個常量
Gson gson = new GsonBuilder() .excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT, Modifier.VOLATILE) .create();
這個特性提供了一種方法,可以標記某些字段的對象排除序列化和反序列化為JSON。使用這個注解,必須調用new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()。這樣@Expose注解的類和字段才能被序列化和反序列化。
如果排除字段和類類型上述機制不適合你,那麼你可以編寫自己的排斥戰略,並把它應用到GSON。詳細信息請參照文檔,文檔地址ExclusionStragegy
示例
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface Foo { // Field tag only annotation } public class SampleObjectForTest { @Foo private final int annotatedField; private final String stringField; private final long longField; private final Class clazzField; public SampleObjectForTest() { annotatedField = 5; stringField = "someDefaultValue"; longField = 1234; } } public class MyExclusionStrategy implements ExclusionStrategy { private final Class typeToSkip; private MyExclusionStrategy(Class typeToSkip) { this.typeToSkip = typeToSkip; } public boolean shouldSkipClass(Class clazz) { return (clazz == typeToSkip); } public boolean shouldSkipField(FieldAttributes f) { return f.getAnnotation(Foo.class) != null; } } public static void main(String[] args) { Gson gson = new GsonBuilder() .setExclusionStrategies(new MyExclusionStrategy(String.class)) .serializeNulls() .create(); SampleObjectForTest src = new SampleObjectForTest(); String json = gson.toJson(src); System.out.println(json); }
{"longField":1234}
Gson支持一些預先定義的字段命名策略轉換標准的Java字段名,例如小寫字母開頭的駝峰式命名,詳細信息可以參考文檔FieldNamingPolicy
它也有一個基於注解的策略,允許客戶端自定義名稱。請注意,基於策略的注解有字段名的驗證,如果一個無效的字段名稱作為注解將增加運行異常。
下面是一個自定義命名策略的例子
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);
{"custom_naming":"first","SomeOtherField":"second"}
http://groups.google.com/group/google-gson/browse_thread/thread/cb441a2d717f6892
http://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html
有時候需要共享序列化反序列化,可以用下面三個方法
(1)通過靜態字段存儲共享狀態
(2)在父類中定義序列化反序列化內部類,並使用父類型的實例字段來存儲共享狀態。
(3)使用ThreadLocal
1,2是線程不安全的,3是線程安全的
除了Gson的對象模型和數據綁定,可使用GSON讀取和寫入流。也可以流和對象模型的訪問都是用,以獲得最佳的方法。
見GSON設計文檔,對設計GSON時我們面臨的問題進行了探討。也包括GSON與可用於JSON的轉換其他Java庫的比較。
參考地址https://sites.google.com/site/gson/gson-design-document
資源是從github上撸下來的,具體網址忘了。。。我就根據我的資源做個描述:目錄結構:操作步驟:①attrs.xml放在values文件夾下②CircleImageVie
一.功能描述因為是自己開發了一個app應用,沒資格去申請微信支付和支付寶支付,於是就采用了銀聯支付功能,銀聯支付分為了兩種環境:測試環境和生產環境,一般前期開發的時候都是
關於Andorid的第三方庫導入和其他知識:現在講的都是些基礎的東西,東西會一步步往上升的,知道操作的可以在這裡找找問題 ,順便溫習下。然後不知道的就在這裡學習下。第三方
前言 成功的產品往往在細節之處也做到極致,產品和項目從使用的角度來看最大的區別我認為也就是細節的處理上。開播視頻的目標是產品,前面7篇文章高歌猛進,添加了很多的功能,也