1. 程式人生 > >Android中解析json資料的三種方式

Android中解析json資料的三種方式

Json簡介

JAVAScript Object Notation是一種輕量級的資料交換格式
具有良好的可讀和便於快速編寫的特性。
業內主流技術為其提供了完整的解決方案(有點類似於正則表示式 ,獲得了當今大部分語言的支援)
JSON採用相容性很高的文字格式,同時也具備類似於C語言體系的行為。 – Json.org
JSON作為資料是目前網路中主流的資料傳輸格式之一,應用十分廣泛,說是使用率達到99%一點也不勉強

JSON支援的資料型別

我們要學習使用JSON解析,必須對JSON解析的規則原理有深刻的認識和了解,然後才知道它的一個實現原理 ,JSON裡面的資料是以一種鍵值對的方式存在 (“key”:“value”)中值的型別可以是下面資料型別中的任意一種:

  1. 數字(整數或浮點數)
  2. 邏輯值(true 或 false)
  3. 字串(在雙引號中)
  4. 陣列(在方括號中)
  5. 函式
  6. 物件(在大括號中)
  7. null

JSON語法規則

JSON的語法規則非常的簡單,就是使用
大括號’{}’,
中括號’[]’,
逗號’,’,
冒號’:’,
雙引號’“”’。

資料型別:
巢狀物件、陣列、字串、數字、布林值或空值。

我們在JSON解析中只有三中情況出現
1.{} 解析’大括號’型別

  1. 解析是’中括號’型別
  2. 其實只有兩種,那第三種則是1與2的組合方法即”{’name’:’李書豪’ ,’hobby’:[‘程式設計’,’電競’,’睡覺’]}”那麼下面分別來看一些這三種類型以及解析

JSON基本語法與圖例

Object(物件型別)

用{ }包含一系列無序的key–Value鍵值對錶示,其中Key和Value之間用冒號分割,每個key-value之間用逗號分割。

這裡寫圖片描述

Array(陣列型別)

使用[ ]包含所有元素,每個元素用逗號分隔,元素可以是任意的值
這裡寫圖片描述

二者相結合型
這裡寫圖片描述
這裡寫圖片描述

JSON資料解析

JSON解析一定要掌握的兩條規則:

1.如果看到是{ }–>使用JSONObject
2.如果看到的[ ]–>使用JSONArray解析
掌握了JSON的資料型別和基本語法後,下面我們將對JSON的各種語法型別進行詳細解析(注意掌握兩條規則的使用,掌握了JSON解析就那麼回事)

Android解析json方案

Json資料

[{"code":"110000","sheng":"11","di":"00","xian":"00","name":"北京市","level":1},{"code":"659004","sheng":"65","di":"90","xian":"04","name":"五家渠市","level":3},{"code":"710000","sheng":"71","di":"00","xian":"00","name":"臺灣省","level":1},{"code":"810000","sheng":"81","di":"00","xian":"00","name":"香港特別行政區","level":1},{"code":"820000","sheng":"82","di":"00","xian":"00","name":"澳門特別行政區","level":1}] 

這裡附上一個檢查json資料格式是否正確的網站http://www.json.cn/
通過網站解析工具解析完的資料格式如下

[
    {
        "code":"110000",
        "sheng":"11",
        "di":"00",
        "xian":"00",
        "name":"北京市",
        "level":1
    },
    {
        "code":"659004",
        "sheng":"65",
        "di":"90",
        "xian":"04",
        "name":"五家渠市",
        "level":3
    },
    {
        "code":"710000",
        "sheng":"71",
        "di":"00",
        "xian":"00",
        "name":"臺灣省",
        "level":1
    },
    {
        "code":"810000",
        "sheng":"81",
        "di":"00",
        "xian":"00",
        "name":"香港特別行政區",
        "level":1
    },
    {
        "code":"820000",
        "sheng":"82",
        "di":"00",
        "xian":"00",
        "name":"澳門特別行政區",
        "level":1
    }
]

第一種方案:android自帶的解析

json_btn.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       String s = getString();
       Log.d("txt",s);
       List<City> list = new ArrayList<City>();
       try {
         JSONArray obj = new JSONArray(s);
         for(int i=0;i<obj.length();i++){
           JSONObject jsonobj = (JSONObject)obj.get(i);
           City city = new City();
           city.setCode(jsonobj.getString("code"));
           city.setSheng(jsonobj.optString("sheng"));
           city.setDi(jsonobj.optString("di"));
           city.setXian(jsonobj.optString("xian"));
           city.setName(jsonobj.optString("name"));
           city.setLevel(jsonobj.optInt("level"));
           Log.d("txt",city.toString());
           textView.append(city.toString());
         }
       } catch (JSONException e) {
         e.printStackTrace();
       }
 
     }
   });

先獲取JSON陣列,在解析JsonObject。

第二種方案: Gson解析

Gson_btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        String s = getString();
        JsonParser parser = new JsonParser();
        JsonArray jsonArray = parser.parse(s).getAsJsonArray();
        Gson gson = new Gson();
        for (JsonElement obj:jsonArray){
          City city = gson.fromJson(obj,City.class);
          Log.d("txt", city.toString());
          textView.append(city.toString());
           }
        }
    });

先獲取Json陣列,再解析jsonObject。

第三種方案:FastJson

fastjson_btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        String s = getString();
        Log.d("txt",s);
        List<City> lists = JSON.parseArray(s,City.class);
 
        for(City city:lists){
          textView.append(city.toString());
          Log.d("txt",city.toString());
        }
      }
    });

直接獲取JsonArray解析List。

public static final Object parse(String text); // 把JSON文字parse為JSONObject或者JSONArray 
 
   public static final JSONObject parseObject(String text); // 把JSON文字parse成JSONObject 
 
   public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文字parse為JavaBean 
 
   public static final JSONArray parseArray(String text); // 把JSON文字parse成JSONArray
 
  public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文字parse成JavaBean集合 
 
   public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文字 
 
   public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文字

public static final Object toJSON(Object javaObject); 將JavaBean轉換為JsonObject或者JsonArray(和上面方法的區別是返回值是不一樣的)
三種解析方法,個人感覺fastjson使用起來還是很方便的。