JSON數(shù)據(jù)通信--org.json和Gson基本用法

前言:從這篇文章開始宋下,正式進(jìn)入本人的網(wǎng)絡(luò)和數(shù)據(jù)通信方面的修煉和學(xué)習(xí)咙好,期間會(huì)持續(xù)有數(shù)據(jù)通信相關(guān)的學(xué)習(xí)文章發(fā)布。

一碱璃、JSON學(xué)習(xí)網(wǎng)站介紹

二惊窖、org.json基本用法

注意:

  1. json是Android SDK官方的庫。
  2. Java中要用到org.json【也就是用到常見的JSONObject或JSONArray類等】厘贼,前提是導(dǎo)入 org.json jar包。目前常用的如:org.codeartisans:org.json圣拄,也自行上網(wǎng)下載或Maven倉庫查找導(dǎo)入嘴秸。
1. 普通JSONObject對(duì)象的構(gòu)建
public static JSONObject createJson(){
    JSONObject object = new JSONObject();
    object.put("name", "王小明");
    object.put("age", 18.2);
    object.put("birthday", "1990-01-01");
    object.put("school", "藍(lán)翔");
    object.put("major", new String[]{"搬磚","挖掘機(jī)"};
    object.put("car",nullObj);
    object.put("comment", "這是注釋");
    return object;
}
2. 通過Map,構(gòu)建json
public static JSONObject createJsonByMap(){
    Map<String,Object> map = new HashMap<String, Object>();
    Object nullObj = null;
    map.put("name", "王小明");
    map.put("age", 18.2);
    map.put("birthday", "1990-01-01");
    map.put("school", "藍(lán)翔");
    map.put("major", new String[]{"搬磚","挖掘機(jī)"};
    map.put("car",nullObj);
    map.put("comment", "這是注釋");

    return new JSONObject(map);
}
3. 通過Bean對(duì)象創(chuàng)建JsonObject對(duì)象
// 新建一個(gè)Bean對(duì)象庇谆,并提供getter和setting方法岳掐,注意:1.bean對(duì)象的成員,是:String饭耳、基本數(shù)據(jù)類型串述、Object類型
public static JSONObject createJsonByBean(){
    Person xiaoming = new Person();
    xiaoming.setName("王小明");
    //......
    xiaoming.setCar(null);
    //.......
    return new JSONObject(xiaoming);
}
4. 讀取.json文件中的內(nèi)容,并解析成JSONObject對(duì)象
//用到:org.apache.commons.io.FileUtils 文件
public static void main(String[] args) throws IOException {
        File file = new File(JsonTest.class.getResource("/basic/json/test.json").getFile());
        String content = readFileToString(file);
        System.out.println(content);
        JSONObject jsonObject = new JSONObject(content);
        if (!jsonObject.isNull("name")) {
            System.out.println(jsonObject.getString("name"));
        }
        JSONArray array = jsonObject.getJSONArray("major");
        for(int i=0;i<array.length();i++){
            System.out.println("major: "+ array.get(i));
        }
    }

三寞肖、GSON

包:com.google.gson

1.用法:

  1. 【序列化】解析Bean對(duì)象纲酗,變成json串
Gson gson = new Gson();
String jsonStr = gson.toJson(bean對(duì)象);

<u>復(fù)雜對(duì)象的情況可以參考以下的反序列化中的復(fù)雜類的例子,注意靜態(tài)內(nèi)部類的寫法新蟆。</u>

  1. 【反序列化】json串變成POJO對(duì)象
  2. 解析簡(jiǎn)單類型對(duì)象
Gson gson = new Gson();
int i = gson.fromJson("100", int.class);
double d = gson.toJson("\"9.9\"", double.class);
String s = gson.toJson("ABC", String.class);
Bean bean = gson.toJson(json字符串 , Bean.class);//最終轉(zhuǎn)成Object對(duì)象
/// ..............................
///其中Bean的成員是簡(jiǎn)單類型
public class Bean{
  private int id;
  private int age;
  private String name;
  /// getter觅赊、setter等
}
  1. 方式二:解析復(fù)雜對(duì)象
    如果我的Bean對(duì)象中的成員帶有List<>類型或Object子類等:
public class Bean{
  private int id;
  private int age;
  private Address address;
  private List<Friend> friends;
  ////自動(dòng)反序列化的話,必須寫成靜態(tài)內(nèi)部類的形式G淼尽吮螺!
  public static class Address{
    public String street;
    public String city;
    public String province;
  }
  public static class Friend{
    public String name;
    public String phoneNumber;
  }
  /// getter、setter等
}

然后,解析方法為:

Gson gson = new Gson();
Bean bean = gson.fromJson(json串, Bean.class);
//或者
Type type = new TypeToken<Bean>(){}.getType();
Bean bean = gson.fromJson(json串鸠补,type);

當(dāng)Bean對(duì)象中存在 List<String>類型或者Set<String>類型萝风,而不是String[]時(shí),GSON同樣可以將json串中的數(shù)組或集合解析出來紫岩,并以GSON默認(rèn)的集合類型來構(gòu)建规惰,如下:
* List<String> -> ArrayList<String>
* Set<String> -> LinkedHashSet<String>

  1. Builder監(jiān)聽解析過程
//.....
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy(){

    public String translateName(Field f){
        if(f.getName().equals("name")){//改名(注意這里,與注釋:@SerialzedName("name")是有沖突的被因,這個(gè)時(shí)候卿拴,注釋優(yōu)先級(jí)更大)
            return "NAME";
        }
        return f.getName();
    }
});
//.....

2. 強(qiáng)大之處:

  1. @SerializedName("NAME")可以將Bean類的成員name,更名為NAME梨与,并轉(zhuǎn)為json堕花,如:
public class Bean{
  @SerializedName("NAME")
  private String name;
  //......
}

在轉(zhuǎn)換時(shí),將得到:

{"NAME": "小明", ……}

而不是

{"name": "小明", ……}
  1. Object轉(zhuǎn)json串過程中粥鞋,忽略某個(gè)屬性:
  • 方式一:Bean類中缘挽,可以聲明一個(gè)成員屬性,如:private transient String ignore; 這樣一來呻粹,這個(gè)成員屬性壕曼,就不會(huì)被解析成json串當(dāng)中。
  • 方式二:如果這個(gè)成員屬性是String或者默認(rèn)為null的類型等浊,那么腮郊, 只要不初始化此屬性,默認(rèn)解析過程中筹燕,不會(huì)被解析到j(luò)son串中轧飞。
  1. 支持Data日期類型
    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
  2. GsonBuilder
    通過GsonBuilder配置Gson對(duì)象,去達(dá)到更多效果的解析:
Gson gson = new GsonBuilder() 
//序列化null 
.serializeNulls() 
// 設(shè)置日期時(shí)間格式撒踪,另有2個(gè)重載方法 
// 在序列化和反序化時(shí)均生效
 .setDateFormat("yyyy-MM-dd")
 // 禁此序列化內(nèi)部類 
.disableInnerClassSerialization()
 //生成不可執(zhí)行的Json(多了<u> ')]}' </u>這4個(gè)字符) 
.generateNonExecutableJson() 
//禁止轉(zhuǎn)義html標(biāo)簽 
.disableHtmlEscaping() 
//格式化輸出 
.setPrettyPrinting() 
.create();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末过咬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子制妄,更是在濱河造成了極大的恐慌掸绞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耕捞,死亡現(xiàn)場(chǎng)離奇詭異衔掸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砸脊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門具篇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凌埂,你說我怎么就攤上這事驱显。” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵埃疫,是天一觀的道長(zhǎng)伏恐。 經(jīng)常有香客問我,道長(zhǎng)栓霜,這世上最難降的妖魔是什么翠桦? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮胳蛮,結(jié)果婚禮上销凑,老公的妹妹穿的比我還像新娘。我一直安慰自己仅炊,他們只是感情好斗幼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抚垄,像睡著了一般蜕窿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呆馁,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天桐经,我揣著相機(jī)與錄音,去河邊找鬼浙滤。 笑死阴挣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纺腊。 我是一名探鬼主播屯吊,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摹菠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骗爆,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤次氨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后摘投,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煮寡,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年犀呼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幸撕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡外臂,死狀恐怖坐儿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤貌矿,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布炭菌,位于F島的核電站,受9級(jí)特大地震影響逛漫,放射性物質(zhì)發(fā)生泄漏黑低。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一酌毡、第九天 我趴在偏房一處隱蔽的房頂上張望克握。 院中可真熱鬧,春花似錦枷踏、人聲如沸菩暗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勋眯。三九已至,卻和暖如春下梢,著一層夾襖步出監(jiān)牢的瞬間客蹋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工孽江, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讶坯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓岗屏,卻偏偏與公主長(zhǎng)得像辆琅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子这刷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容