一 種輕量級的數據交換格式,具備良好的可讀和便於快速編寫的特性。業內主流技術爲其提供了完整的解決方案(有點相似於正則表達式 ,得到了當今大部分語言的 支持),從而能夠在不一樣平臺間進行數據交換。JSON採用兼容性很高的文本格式,同時也具有相似於C語言體系的行爲。 – Json.orghtml
JSON Vs XML
java
1.JSON和XML的數據可讀性基本相同android
2.JSON和XML一樣擁有豐富的解析手段正則表達式
3.JSON相對於XML來說,數據的體積小json
4.JSON與JavaScript的交互更加方便api
5.JSON對數據的描述性比XML較差數組
6.JSON的速度要遠遠快於XML
android2.3提供的json解析類 ide
android的json解析部分都在包org.json下,主要有如下幾個類:
函數
JSONObject:能夠看做是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External: 應用toString()方法輸出的數值)調用的響應體現爲一個標準的字符串(例如:{"JSON": "Hello, World"},最外被大括號包裹,其中的Key和Value被冒號":"分隔)。其對於內部(Internal)行爲的操做格式略微,例如:初始化一個JSONObject實例,引用內部的put()方法添加數值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗號","分隔。Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object 。this
JSONStringer:json文本構建類 ,根據官方的解釋,這個類能夠幫助快速和便捷的建立JSON text。其最大的優勢在於能夠減小因爲 格式的錯誤致使程序異常,引用這個類能夠自動嚴格按照JSON語法規則(syntax rules)建立JSON text。每一個JSONStringer實體只能對應建立一個JSON text。。其最大的優勢在於能夠減小因爲格式的錯誤致使程序異常,引用這個類能夠自動嚴格按照JSON語法規則(syntax rules)建立JSON text。每一個JSONStringer實體只能對應建立一個JSON text。
JSONArray:它 表明一組有序的數值。將其轉換爲String輸出(toString)所表現的形式是用方括號包裹,數值以逗號」,」分隔(例如: [value1,value2,value3],你們能夠親自利用簡短的代碼更加直觀的瞭解其格式)。這個類的內部一樣具備查詢行爲, get()和opt()兩種方法均可以經過index索引返回指定的數值,put()方法用來添加或者替換數值。一樣這個類的value類型能夠包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object。
JSONTokener:json解析類
JSONException:json中用到的異常
JSONObject, JSONArray來構建json文本
getType和optType api的使用
getType能夠將要獲取的鍵的值轉換爲指定的類型,若是沒法轉換或沒有值則拋出JSONException
optType也是將要獲取的鍵的值轉換爲指定的類型,沒法轉換或沒有值時返回用戶提供或這默認提供的值
除了上面的兩個類,還可使用JSONStringer來構建json文本
json文本解析類JSONTokener
按照RFC4627規範將json文本解析爲相應的對象。
對於將json文本解析爲對象,只須要用到該類的兩個api:
構造函數
public Object nextValue();
其它的api基本就是用來查看json文本中的文本的
如下是一個標準的JSON請求實現過程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
HttpPost request =
new
HttpPost(url);
// 先封裝一個 JSON 對象
JSONObject param =
new
JSONObject();
param.put(
"name"
,
"rarnu"
);
param.put(
"password"
,
"123456"
);
// 綁定到請求 Entry
StringEntity se =
new
StringEntity(param.toString());
request.setEntity(se);
// 發送請求
HttpResponse httpResponse =
new
DefaultHttpClient().execute(request);
// 獲得應答的字符串,這也是一個 JSON 格式保存的數據
String retSrc = EntityUtils.toString(httpResponse.getEntity());
// 生成 JSON 對象
JSONObject result =
new
JSONObject( retSrc);
String token = result.get(
"token"
);
|
下面這個是本身修改別人的小例子,主要是加一些註釋和講解,這個例子主要是使用android進行json解析。
1
2
3
4
5
6
|
單數據{'singer':{'id':01,'name':'tom','gender':'男'}}
多個數據{"singers":[
{'id':02,'name':'tom','gender':'男'},
{'id':03,'name':'jerry,'gender':'男'},
{'id':04,'name':'jim,'gender':'男'},
{'id':05,'name':'lily,'gender':'女'}]}
|
下面的類主要是解析單個數據parseJson()和多個數據的方法parseJsonMulti():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
public
class
JsonActivity
extends
Activity {
/** Called when the activity is first created. */
private
TextView tvJson;
private
Button btnJson;
private
Button btnJsonMulti;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvJson = (TextView)
this
.findViewById(R.id.tvJson);
btnJson = (Button)
this
.findViewById(R.id.btnJson);
btnJsonMulti = (Button)
this
.findViewById(R.id.btnJsonMulti);
btnJson.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
// url
// String strUrl = "http://10.158.166.110:8080/AndroidServer/JsonServlet";
String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGER);
//得到返回的Json字符串
String strResult = connServerForResult(strUrl);
//解析Json字符串
parseJson(strResult);
}
});
btnJsonMulti.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGERS);
String strResult = connServerForResult(strUrl);
//得到多個Singer
parseJsonMulti(strResult);
}
});
}
private
String connServerForResult(String strUrl) {
// HttpGet對象
HttpGet httpRequest =
new
HttpGet(strUrl);
String strResult =
""
;
try
{
// HttpClient對象
HttpClient httpClient =
new
DefaultHttpClient();
// 得到HttpResponse對象
HttpResponse httpResponse = httpClient.execute(httpRequest);
if
(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 取得返回的數據
strResult = EntityUtils.toString(httpResponse.getEntity());
}
}
catch
(ClientProtocolException e) {
tvJson.setText(
"protocol error"
);
e.printStackTrace();
}
catch
(IOException e) {
tvJson.setText(
"IO error"
);
e.printStackTrace();
}
return
strResult;
}
// 普通Json數據解析
private
void
parseJson(String strResult) {
try
{
JSONObject jsonObj =
new
JSONObject(strResult).getJSONObject(
"singer"
);
int
id = jsonObj.getInt(
"id"
);
String name = jsonObj.getString(
"name"
);
String gender = jsonObj.getString(
"gender"
);
tvJson.setText(
"ID號"
+id +
", 姓名:"
+ name +
",性別:"
+ gender);
}
catch
(JSONException e) {
System.out.println(
"Json parse error"
);
e.printStackTrace();
}
}
//解析多個數據的Json
private
void
parseJsonMulti(String strResult) {
try
{
JSONArray jsonObjs =
new
JSONObject(strResult).getJSONArray(
"singers"
);
String s =
""
;
for
(
int
i =
0
; i < jsonObjs.length() ; i++){
JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i))
.getJSONObject(
"singer"
);
int
id = jsonObj.getInt(
"id"
);
String name = jsonObj.getString(
"name"
);
String gender = jsonObj.getString(
"gender"
);
s +=
"ID號"
+id +
", 姓名:"
+ name +
",性別:"
+ gender+
"\n"
;
}
tvJson.setText(s);
}
catch
(JSONException e) {
System.out.println(
"Jsons parse error !"
);
e.printStackTrace();
}
}
}
|