當前位置:首頁 » 安卓系統 » gsonandroid

gsonandroid

發布時間: 2022-10-22 15:28:44

1. android開發用gson解析json字元串,如果鍵不是固定值怎麼辦

這樣沒試過,不過我認為可以將json中鍵值不固定的存在JSONArray中訪問時奇數位保存鍵,偶數保存值;也可以只傳值;還有就是多層嵌套(例如:假設字母表示鍵,數字表示值:a:2,b:5替換成i:a,ii:2,iii:b,iiii:5這意思就是將鍵與值都作為值傳過來)。要麼每一次變化都寫一個類來與之對應,不同的時候用不同的類的實例接收

2. android 怎麼添加gson

在Android開發中,我們Android客戶端如果要和伺服器端交互,一般都會採用json數據格式進行交互,json對於大家來說都不陌生,本文講述一下關於gson,gson和其他現有java json類庫最大的不同時gson需要序列化得實體類不需要使用annotation來標識需要序列化得欄位,同時gson又可以通過使用annotation來靈活配置需要序列化的欄位。
舉一個簡單的例子:
一個實體類 Person.java,參考代碼如下:
public class Person {
private String name;
private int age;
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;
}
@Override
public String toString()
{
return name + ":" +age;
}
}

這個類賦值,看看如何使用gson如何使用:
1.gson生成Json字元串
Gson gson = new Gson();//實例化gson
List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < 10; i++) {
Person p = new Person();
p.setName("name" + i);
p.setAge(i * 5);
persons.add(p);
}
String str = gson.toJson(persons);//轉換json
說明:上面代碼主要說明gson的使用,它提供了toJason()方法將對象轉換成Json字元串,轉換出來就是很標準的json字元串.

2.gson如何將json字元串轉換成java實體類
Gson提供了fromJson()方法來實現從Json相關對象到java實體的方法。
日常應用中,我們一般都會碰到兩種情況,轉成單一實體對象和轉換成對象列表或者其他結構。
1)轉換單一java實體如何實現
比如json字元串為:[{"name":"張三","age":20}],那麼轉換方式如下:
Person person = gson.fromJson(str, Person.class);

2)轉換成列表類型
比如json字元串為:[{"name":"張三","age":20},{"name":"李四","age":15},{"name":"王五","age":21}]
List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
for(int i = 0; i < ps.size() ; i++)
{
Person p = ps.get(i);
System.out.println(p.toString());
}
說明:上面的代碼使用了TypeToken,它是gson提供的數據類型轉換器,可以支持各種數據集合類型轉換。

3. android proguard 混淆後gson解析數據一直為null

混淆代碼的時候注意事項:android使用打包過程中proguard混淆後,會導致一些錯誤1.寫在視圖xml中的onClick響應出錯.因為寫在xml中的onClick是通過反射調用的,proguard認為它們沒有在代碼中被調用過,所以將它們從代碼中除掉或改名了.解決方法:在proguard.cfg中添加以下代碼,就可以防止被配在視圖xml中的onClick方法被proguard優化掉-keepclassmembersclass*extendsandroid.app.Activity{publicvoid*(android.view.View);}2.jni反調java方法這些類或方法同樣可能會被proguard認為沒有調用過而被除掉,或都被改名.這些方法最好統一寫在一個類中,然後這個類不作優化,或是找出所有jni調用過的類與方法,在proguard.cfg中配置,不對它們作優化3.其它反射調用的java類與方法使用反射時一定要注意proguard可能會認為那些方法未被調用過,會在代碼優化過程中將它們改名或除去.在使用反射的地方一定要在proguard.cfg中配置,不優化反射調用過的類和方法最後在proguard優化過後會產生一些文件mp.txt–描述.apk文件中所有類文件間的內部結構mapping.txt–列出了原始的類,方法和欄位名與混淆後代碼間的映射。這個文件很重要,當你從release版本中收到一個bug報告時,可以用它來翻譯被混淆的代碼。seeds.txt–列出了未被混淆的類和成員usage.txt–列出了從.apk中刪除的代碼要注意分析mapping.txt與usage.txt看xml視圖中寫的onClick響應函數,jni調用到的java類與方法,反射調用過的類與方法是否被混淆或重命名-keepclasscom.badlogic.gdx.backends.android.**{*;}像這樣的只是不混淆:這個包下的類(不包括子包里的東西),用到一個第三文的類就要把這個類所在的包,像上面加上還要注意的是android-support-v4.jar這個包問題,這里加上了對這個jar包的處理詳細可參見:9928801

4. android gson gson new gson 怎麼用法

google共享的開源Gson在解析速度和所使用的內存在有著明顯的優勢,雖然說阿里巴巴也提供了fastgson包,但是它跟Gson的處理速度大同小異,只是底層實現的原理不同,在這里就來學習一下怎麼使用google的開源包Gson(在學習之間你應該下載好google gson包)
Gson的解析非常簡單,但是它的解析規則是必須有一個bean文件,這個bean文件的內容跟JSon數據類型是一一對應的

public class user {
private String name;
private int age;
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 user(String name, int age) {
super();
this.name = name;
this.age = age;
}

5. Android開發中應該使用哪一種主流json框架

Android開發中應該使用的主流json框架有三種,分別是gson、fastjson、jackson這三種。
各自的區別:
gson:谷歌開發的gson很受國內外人士常使用,不過使用率低於fastjson,耗費內存多。
fastjson:框架的fastjson是最小的,屬於老牌並且國內開發者經常使用,fastjson必須有默認的構造函數。
jackson:jackson屬於小眾開發者使用的,jackson的框架包是最大的。

6. android中gson怎麼解析json數組

首先要導入Gson包;
例如有個penson類:
Gson gson = new Gson();
String json ;
person[] pers = gson. fromJson (json , person[].class);

7. android中gson解析怎樣防止參數確實

最近在做天氣預報的項目,需要用到多重JSON的解析,這里我選用了目前流行的,也公認是最簡單易用的框架GSON來解析這個復雜的JSON,雖然在最後結果很簡單,但並不意味著整個過程很簡單,沒有一點問題,恰恰是相反的,我是第一次學習這個GSON,雖然在網上看博客一看即知怎麼操作,但是一動手,卻發生問題還是有的。

首先,先上我的JSON結構:

{"desc":"OK","status":1000,"data":{"wen":"15","ganmao":"晝夜溫差很大,易發生感冒,請注意適當增減衣服,加強自我防護避免感冒。","forecast":[{"fengxiang":"南風","fengli":"微風級","high":"高溫16℃","type":"晴","low":"低溫2℃","date":"14日星期二"},{"fengxiang":"南風","fengli":"微風級","high":"高溫16℃","type":"多雲","low":"低溫4℃","date":"15日星期三"},{"fengxiang":"南風","fengli":"微風級","high":"高溫17℃","type":"多雲","low":"低溫7℃","date":"16日星期四"},{"fengxiang":"南風","fengli":"微風級","high":"高溫16℃","type":"陰","low":"低溫5℃","date":"17日星期五"},{"fengxiang":"南風","fengli":"微風級","high":"高溫19℃","type":"晴","low":"低溫5℃","date":"18日星期六"}],"yesterday":{"fl":"微風","fx":"南風","high":"高溫14℃","type":"晴","low":"低溫2℃","date":"13日星期一"},"aqi":"38","city":"北京"}}

在實現時,我是有進行過分層的,這里,我就忽略了……

首先,照著網上一個簡單的教程,我把JAVABEAN,設置成這樣:

{CSDN:CODE:public class TestBean {
public String desc;
public int status;
public List<Data> data;
public class Data {
public String wen;
public String ganmao;
public List<Forecast> forecast;
public List<Yesterday> yesterday;
public String aqi;
public String city;
public class Forecast {
public String fengxiang;
public String fengli;
public String high;
public String type;
public String low;
public String date;}
public class Yesterday {
public String fl;
public String fx;
public String high;
public String type;
public String low;
public String date;}
}
}}

這里有兩個點想說的,正確的是,一是成員變數名一定是跟JSON的欄位完全一樣的,那個沒有「」的數字數據的話要用int,我一開始照著網上模仿這個,把內層的數據都用一個List<內部類名稱>來表示。結果是失敗的。

接著,我把代碼又拆成了網上分多個類出來,每個類都加多一個getter和setter,我本著大腦想,或許上個想得過於簡單,可能系統還需要重寫toString方法,而且這些都是有規矩的。

如下圖:

做到這里,我還是想驗證所有我不太清楚的點,第一,我改了類名,比如把內部類的名稱改了,這里證明是不會有影響的,但是欄位名是一定要一樣的。第二,我又建了一個和開始一樣的,只有極簡的結構類,嘗試如果沒有 setter和getter有沒有影響,結果是沒影響的,toString也是可有可無的。

總之,只要保證對JSON結果的正確解構,還有分析對象,是單個類,還是一個集合類。

最後,學習的過程中,要盡量地去嘗試,不斷地思考,不要嫌簡單,遇到問題,不要想著去依賴別人幫自己解決,問題千變萬化,自己還得停下來想想。

感謝閱讀,如果不妥的地方,請指出。

8. 怎樣在androidstudio中導入gson包

MySQL
SQLite
Android Studio如何在項目中添加gson-2.2.3.jar?
標簽: Android Android-Studio

我嘗試使用新的Android Studio,但我似乎無法讓它正常工作.
我使用Gson類庫來序列化/反序列化JSON對象.但是類庫不知何故無法包含在項目里.
我創建一個新的項目只用MainActivity.在/libs文件夾里復制gson-2.2.3.jar並添加它為一個類庫.這樣在android studio里包含了jar,因此它可以從源文件被引用.
當我試著運行項目,但是它無法被編譯,所以我在.gradle文件里添加:

1

compile files('libs/gson-2.2.3.jar')

到依賴項里.然後我成功編譯了項目,但是當我運行應用程序後,得到ClassDefNotFoundException異常.
解決方法 1:
把Gson jar(在我的項目里,是gson-2.2.4.jar)放入libs文件夾
右擊它,然後點擊 'Add as library'
確保編譯文件('libs/gson-2.2.4.jar')在你的build.gradle文件里
注意:
第二步是關鍵步驟,如果漏了,將出現你無法運行的問題.

9. Android Gson 使用詳解

Json 是一種文本形式的數據交換格式,比 xml 更為輕量。Json 的解析和生成的方式很多,在 Android 平台上最常用的類庫有 Gson 和 FastJson 兩種,這里要介紹的是 Gson

Gson 的 GitHub 主頁點擊這里: Gson

在進行序列化與反序列操作前,需要先實例化一個 com .google.gson.Gson 對象,獲取 Gson 對象的方法有兩種

利用 Gson 可以很方便地生成 Json 字元串,通過使用 addProperty 的四個重載方法

addProperty 方法底層調用的是 add(String property, JsonElement value) 方法,即將基本數據類型轉化為了 JsonElement 對象,JsonElement 是一個抽象類,而 JsonObject 繼承了 JsonElement ,因此我們可以通過 JsonObject 自己來構建一個 JsonElement

Json數組 與 字元串數組

Json數組 與 List

Gson 也提供了 toJson() 和 fromJson() 兩個方法用於轉化 Model 與 Json,前者實現了序列化,後者實現了反序列化
首先,聲明一個 User 類

序列化的方法很簡單,調用 gson 對象的 toJson 方法,傳入要序列化的對象

反序化的方式也類似

繼續使用上一節聲明的 User 類,根據 User 類聲明的各個屬性名,移動端的開發者希望介面返回的數據格式即是如下這樣的

如果沒有和伺服器端溝通好或者是 API 改版了,介面返回的數據格式可能是這樣的

如果繼續使用上一節介紹的方法,那無疑會解析出錯
例如

name 屬性值解析不到,所以為 null

此時為了兼顧多種格式的數據,就需要使用 SerializedName 註解
根據 SerializedName 的聲明來看,SerializedName 包含兩個屬性值,一個是字元串,一個是字元串數組,而字元串數組含有默認值

SerializedName 的作用是為了在序列化或反序列化時,指導 Gson 如果將原有的屬性名和其它特殊情況下的屬性名聯系起來

例如,修改 User 類,為 name 聲明 SerializedName 註解,註解值為 userName

在序列時,Json 格式就會相應改變

在反序列化時也一樣,能夠解析到正確的屬性值

還有個問題沒解決,為了應對多種屬性名不一致的情況,難道我們要聲明多個 User 類嗎?這顯然是不現實的,所以還需要為 User 類設置多個備選屬性名,這就需要用到 SerializedName 註解的另一個屬性值 alternate 了。

以下幾種情況都能夠被正確的反序列化

有時候並不是所有的欄位都需要進行系列化和反序列化,因此需要對某些欄位進行排除,有四種方法可以來實現這種需求。

Expose 註解包含兩個屬性值,且均聲明了默認值。Expose 的含義即為「暴露」,即用於對外暴露欄位,serialize 用於指定是否進行序列化,deserialize 用於指定是否進行反序列化。如果欄位不聲明 Expose 註解,則意味著不進行序列化和反序列化操作,相當於兩個屬性值均為 false 。此外,Expose 註解需要和 GsonBuilder 構建的 Gson 對象一起使用才能生效。

Expose 註解的註解值聲明情況有四種

現在來看個例子,修改 User 類

按照如上的註解值,只有聲明了 Expose 註解且 serialize 值為 true 的欄位才能被序列化,只有聲明了 Expose 註解且 deserialize 值為 true 的欄位才能被反序列化

Gson 提供了 @Since 和 @Until 兩個註解基於版本對欄位進行過濾,@Since 和 @Until 都包含一個 Double 屬性值,用於設置版本號。Since 的意思是「自……開始」,Until 的意思是「到……為止」,一樣要和 GsonBuilder 配合使用。

當版本( GsonBuilder 設置的版本) 大於或等於 Since 屬性值或小於 Until 屬性值時欄位會進行序列化和反序列化操作,而沒有聲明註解的欄位都會加入序列化和反序列操作

現在來看個例子,修改 User 類

訪問修飾符由 java.lang.reflect.Modifier 提供 int 類型的定義,而 GsonBuilder 對象的 excludeFieldsWithModifiers 方法接收一個 int 類型可變參數,指定不進行序列化和反序列化操作的訪問修飾符欄位
看個例子

GsonBuilder 類包含 setExclusionStrategies(ExclusionStrategy... strategies) 方法用於傳入不定長參數的策略方法,用於直接排除指定欄位名或者指定欄位類型
看個例子

欄位名為 "intField" 和欄位類型為 double 的欄位都會被排除掉

setExclusionStrategies 方法在序列化和反序列化時都會生效,如果只是想指定其中一種情況下的排除策略或分別指定排除策略,可以改為使用以下兩個方法

對於 Gson 而言,在序列化時如果某個屬性值為 null 的話,那麼在序列化時該欄位不會參與進來,如果想要顯示輸出該欄位的話,可以通過 GsonBuilder 進行配置

默認的序列化後的 Josn 字元串並不太直觀,可以選擇格式化輸出

Gson 也可以對時間值進行格式化

TypeAdapter 是一個泛型抽象類,用於接管某種類型的序列化和反序列化過程,包含兩個抽象方法,分別用於自定義序列化和反序列化過程

下面看個簡單的例子

定義 TypeAdapter 的子類 UserTypeAdapter 來接管 User 類的序列化和反序列化過程
這里設定當 User 類序列化時 Json 中的Key值都是大寫字母開頭,反序列化時支持「name」和「Name」兩種不同的 Json 風格

可以看到 User 類按照預定義的策略來完成序列化和反序列化了

TypeAdapter 將序列化和反序列操作都接管了過來,其實 Gson 還提供了只接管序列化過程的介面,即 JsonSerializer
看個例子

相對應的,JsonDeserializer 介面提供了反序列化的介面

這里有個比較麻煩的地方,那就是在使用 TypeAdapter 、JsonSerializer JsonDeserializer 時,總需要調用 registerTypeAdapter 方法進行注冊,那有沒有更簡單的注冊方法呢?
有的,Gosn 還提供了另一個註解 @JsonAdapter 用於進行簡單的聲明

類似於這樣,聲明了 User 類的序列化或反序列化操作由 UserTypeAdapter 完成,註解的優先順序高於 registerTypeAdapter 方法

TypeAdapterFactory 是用於創建 TypeAdapter 的工廠類,通過參數 TypeToken 來查找確定對應的 TypeAdapter,如果沒有就返回 null 並由 Gson 默認的處理方法來進行序列化和反序列化操作,否則就由用戶預定義的 TypeAdapter 來進行處理

這一篇文章好像寫得太長了一點?Gson 的知識點介紹到這里也差不多了,以後如果還發現新內容的話我會繼續補充,現在就先這樣啦

10. android怎麼用gson做本地存儲

Android存儲文件通常可以用SharedPreferences、SQLite、Content Provider和File,但是SharedPreferences只支持簡單的key-value,
通常,如果要存儲一個對象,可以先把它序列化,然後用輸入輸出流存進file文件

另一個我比較喜歡的方式是:
寫:先把一個對象用gson解析成json字元串(使用gson的toJson函數),然後當成一個value寫進SharedPreferences裡面
讀:讀取出來的時候就再次用gson把json解析成對象(使用gson的fromJson函數)
參考:
Android中的JSON詳細總結

怎樣使用Gson 解析 (deserialize) json字元串

Gson簡要使用筆記

代碼實現:

熱點內容
汽車網源碼下載 發布:2025-01-31 01:58:30 瀏覽:100
解壓交流會 發布:2025-01-31 01:55:23 瀏覽:413
解壓方式的圖片人物 發布:2025-01-31 01:50:28 瀏覽:494
寬頻一般賬號跟密碼是多少 發布:2025-01-31 01:48:14 瀏覽:62
三訪問題 發布:2025-01-31 01:37:36 瀏覽:634
五二好壓的解壓密碼是什麼 發布:2025-01-31 01:27:22 瀏覽:453
c語言計時器代碼 發布:2025-01-31 01:25:57 瀏覽:452
android狀態欄的高度 發布:2025-01-31 01:25:11 瀏覽:389
英雄聯盟手遊走a腳本 發布:2025-01-31 01:20:05 瀏覽:94
跳腳本義 發布:2025-01-31 01:05:05 瀏覽:848