前阵子学习了android中重要的知识点:Json解析,它作为跨平台的数据格式,经常被我们用来实现客户端与服务器之间的数据交换。真正接触到json是在我写毕设中的推送功能时遇到的,推送的数据格式是json格式的,需要对其进行解析,而且该json中数据还涉及到嵌套,所以,下功夫学好json解析是很有必要的,特发一文来记录一下。闲话少说,下面来进入正题,看看json解析如何实现吧:
- 什么是Json?它有什么特点和好处?
特点:1).本质是具有特定格式的字符串;
2).它完全独立于编程语言,可以跨平台使用;
3).Json比xml数据传输有效性、效率要高很多。
- Json的数据格式有哪些?
1.Json对象格式:
结构:{key:value,key:value,...};//key的数据类型为String,value的数据类型为数值、String、空、json对象或者数组
这种以键值对存放的形式类似于数据结构中的map
例子:{“name”:“小美”,“age”:16};
2.Json数组格式:
结构:[value,value,value...];//value的数据类型为数值、空、String、json对象或者数组,同上
类似于数据结构中的list
例子:[12,“小名”,[],{“name”:“小美”}];
json格式的数据总体看起来还是蛮通俗易懂的。
- Json解析的具体使用方向?
2.用于将Json格式的字符串转化为Java的对象,一般应用于客户端
- Json主要解析方式:
1.json原生的解析技术,虽然复杂,但是最为灵活;
2.使用三方框架Gson来解析,使用方便,几行代码搞定,官方推荐系列;
3.FastJson解析,同样使用三方框架,与Gson类似
注意:第一种方式只能将json转化为java对象,而第二种和第三者可以实现两者的互转。
- 使用android原生的json解析技术
这里直接上代码了,里面有注释
// (1)将json格式的字符串{}转换为Java对象
private void jsonToJavaObject() {
// 1 获取或创建JSON数据
String json = "{\n" +
"\t\"id\":2, \"name\":\"大虾\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" +
"}\n";
ShopInfo shopInfo = null;
// 2 解析json
try {
JSONObject jsonObject = new JSONObject(json);
// int id = jsonObject.getInt("id");
int id1 = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double price = jsonObject.optDouble("price");
String imagePath = jsonObject.optString("imagePath");
// 封装Java对象
shopInfo = new ShopInfo(id1, name, price, imagePath);
} catch (JSONException e) {
e.printStackTrace();
}
// 3 显示JSON数据
tv_native_orignal.setText(json);
tv_native_last.setText(shopInfo.toString());
}
注意点:1).可以通过getString()和optString()两种方式来获取JsonObject的数据,区别在于:后者中key不存在时,会返回空字符串或者指定值,而前者会报空指针异常,所以建议使用后者optxxx()方法。
2).需要创建一个数据的实体类来接收数据
// 商店的实体类
public class ShopInfo {
private int id;
private String name;
private double price;
private String imagePath;
public ShopInfo(int id, String name, double price, String imagePath) {
this.id = id;
this.name = name;
this.price = price;
this.imagePath = imagePath;
}
public ShopInfo() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
@Override
public String toString() {
return "ShopInfo{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", imagePath='" + imagePath + '\'' +
'}';
}
}
2.将Json数组转化为Java对象的list
前者只用java对象承接json解析的数据即可,而这里使用对象list来实现
(2)将json格式的字符串数组转换为Java对象的List
private void jsonToJavaList() {
// 1 获取或创建JSON数据
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
" \"name\": \"大虾1\",\n" +
" \"price\": 12.3\n" +
" },\n" +
" {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
" \"name\": \"大虾2\",\n" +
" \"price\": 12.5\n" +
" }\n" +
"]";
List<ShopInfo> shops = new ArrayList<>();
// 2 解析json
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
if (jsonObject != null) {
int id = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double price = jsonObject.optDouble("price");
String imagePath = jsonObject.optString("imagePath");
// 封装Java对象
ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);
shops.add(shopInfo);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
// 3 显示JSON数据
tv_native_orignal.setText(json);
tv_native_last.setText(shops.toString());
}
3.如果是复杂的json数据格式,可以分层解析,可以使用hiJson与as中自带封装对象的工具GsonForMat
小结:注意json常用解析方法和格式,熟悉常用json对象封装的工具GsonForMat以及解析工具,熟悉json复杂解析的步骤流程,下一篇文章会记录一下Gson解析框架的使用。