Android中解析json資料的三種方式
Json簡介
JAVAScript Object Notation是一種輕量級的資料交換格式
具有良好的可讀和便於快速編寫的特性。
業內主流技術為其提供了完整的解決方案(有點類似於正則表示式 ,獲得了當今大部分語言的支援)
JSON採用相容性很高的文字格式,同時也具備類似於C語言體系的行為。 – Json.org
JSON作為資料是目前網路中主流的資料傳輸格式之一,應用十分廣泛,說是使用率達到99%一點也不勉強
JSON支援的資料型別
我們要學習使用JSON解析,必須對JSON解析的規則原理有深刻的認識和了解,然後才知道它的一個實現原理 ,JSON裡面的資料是以一種鍵值對的方式存在 (“key”:“value”)中值的型別可以是下面資料型別中的任意一種:
- 數字(整數或浮點數)
- 邏輯值(true 或 false)
- 字串(在雙引號中)
- 陣列(在方括號中)
- 函式
- 物件(在大括號中)
- null
JSON語法規則
JSON的語法規則非常的簡單,就是使用
大括號’{}’,
中括號’[]’,
逗號’,’,
冒號’:’,
雙引號’“”’。
資料型別:
巢狀物件、陣列、字串、數字、布林值或空值。
我們在JSON解析中只有三中情況出現
1.{} 解析’大括號’型別
- 解析是’中括號’型別
- 其實只有兩種,那第三種則是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使用起來還是很方便的。