JSON,JavaScript Object Notation,JavaScript对象表示法,一种轻量级的数据交互格式,给网络上传输的数据定义的一种格式。发送者在发送数据之前,根据某种规则将对象序列化为一定格式的字符串后再发送;接收者在接收数据之后,根据同样的规则将字符串反序列化为对象后再处理。
网络通信的本质是不同机器进程之间的通信,内部通过io完成数据交换。io传输的数据只能为二进制字节流,虽可通过包装流来直接传输字符流,但底层仍被转成字节流来传输。发送者在发送数据之前,先将字符串数据转成二进制字节流,如字节数组,称为流化,又叫流处理,序列化,最后通过输出流写出;接收者通过输入流读入二进制字节流,存入字节数组,再转为字符数组或字符串,称为反序列化。
综上的一种网络传输模式为,发送方应用内对象转为json字符串,再转为二进制字节流,并传输;接收方应用接收二进制字节流转为json字符串,再转为应用对象,并处理。
json对象串格式,”{\”k1\” : \”v1\”, \”k2\” : \”v2\”, …}”。
json数组串格式,”[\”v1\”, \”v2\”, …]”。
json串由对象串和数组串嵌套而成,”{\”k1\” : \”v1\”, \”k2\” : {\”k\” : \”v\”, …}, \”k3\” : [\”v\”, {\”k\” : \”v\”, …}]}”。
///////////////// java解析json
// google的Gson解析,快速
public void parseJson() {
String jsonStr = "{\"k\" : [\"v1\", \"v2\"]}";
// JsonReader方式,直接处理串
JsonReader reader = new JsonReader(new StringReader(jsonStr));
//读一个json对象出来,大括号之间的内容
reader.beginObject();
// 遍历其每一个键值对
while (reader.hasNext()) {
String key = reader.nextName();
if(key.equals("k")) {
// 从其读一个json数组出来,中括号之间的内容
reader.beginArray();
// 遍历其每一个值
while (reader.hasNext()) {
// 值是XX类型,类型不匹配会出错
reader.nextXX();
}
// 遍历完后关闭数组
reader.endArray();
}
}
// 遍历完后关闭对象
reader.endObject();
// 遍历完后关闭流
reader.close();
Gson gson = new Gson();
// json对象到pojo
User user = gson.fromJson(jsonStr, User.class);
// json数组到pojo
Type listType = new TypeToken<ArrayList<User>>() {}.getType();
ArrayList<User> listUsers = gson.fromJson(jsonStr, listType);
for (int i = 0; i < listUsers.size(); i++) {
User user = listUsers.get(i);
}
// pojo到json对象
String jsonStr = gson.toJson(user);
// pojo数组到json数组
String jsonStr = gson.toJson(listUsers, listType);
}
// 第三方的json-lib,速度不如Gson
public void parseJson() {
String jsonStr = "{\"k\" : [\"v1\", \"v2\"]}";
// json对象到java对象
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
// jsonArray可继续getJSONObject
JSONArray jsonArray = jsonObject.getJSONArray("k");
// map到json对象
JSONObject jsonObject = JSONObject.fromObject(map);
jsonStr = jsonObject.toString();
// pojo到json对象
JSONObject jsonObject = JSONObject.fromObject(user);
jsonStr = jsonObject.toString();
// list到json数组
JSONArray jsonArray = JSONArray.fromObject(list);
jsonStr = jsonObject.toString();
// 数组到json数组
JSONArray jsonArray = JSONArray.fromObject(array);
jsonStr = jsonObject.toString();
}
// 第三方的org.json
public void parseJson() {
// 用法基本同json-lib,依赖的外部jar包少,轻量级
// 在json与bean的转换上不如json-lib,必须借助map中转
}
// 阿里的fastjson,据说比Gson还快
public void parseJson() {
// json对象到bean
User user = JSON.parseObject(jsonStr, User.class);
// json数组到list
List<User> listUsers = JSON.parseArray(jsonStr, User.class);
// bean到json对象
String jsonStr = JSON.toJSONString(user);
// list到json数组
String jsonStr = JSON.toJSONString(personlist);
}
/ js解析json
// 无需额外的js包
var jsonStr = "{\"k1\" : "v1", \"k2\" : \"v2\"}";
var jsonObj = eval( "(" + jsonStr + ")" );
// 需要旧版json.js包
var jsonObj = JSON.parse(jsonStr);
var jsonStr = JSON.stringify(jsonObj);
// 需要新版json.js包
var jsonObj = jsonStr.parseJSON();
var jsonStr = jsonObj.toJSONString();
// 直接使用
jsonObj.key;
jsonObj.key.value;
jsonArray[i];
// jQuery遍历
$.each(jsonObj/jsonArray, function(i, n) {
// i当前下标,n对应键值对
n.k;
n.v;
});