一 种轻量级的数据交换格式,具备良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点相似于正则表达式 ,得到了当今大部分语言的 支持),从而能够在不一样平台间进行数据交换。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();
}
}
}
|