1.什么是Json
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
对象类型数据字符串
{
"id":"1",
"courseID":"化学",
"title":"滴定实验",
"content":"下周二实验楼201必须完成"
}
数组类型数据字符串
[
{
"id":"1",
"courseID":"数学",
"title":"一加一等于几"
},
{
"id":"2",
"courseID":"语文",
"title":"请背诵全文"
}
]
2.解析Json框架种类
2.1.JSONObject and JSONArray
android原生解析框架
2.1.1.json字符串转JSONArray或JSONObject对象
//json字符串最外层是大括号时,转换成JSONObject
JSONObject jsonObject = new JSONObject(jsonObjectStr);
//json字符串最外层是方括号时,JSONArray
JSONArray jsonArray = new JSONArray(jsonArrayStr);
2.1.2.从JSONArray中获得JSONObject对象
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
}
2.1.3.从JsonObject获取JSON内的具体数据
jsonObject.getBoolean("");
jsonObject.getDouble("");
jsonObject.getInt("");
jsonObject.getJSONArray("");
jsonObject.getJSONObject("");
jsonObject.getLong("");
jsonObject.getString("");
2.2.Gson
2.2.1.创建方式
- 直接new Gson创建
使用new Gson(),此时会创建一个带有默认配置选项的Gson实例,如果不想使用默认配置,那么就可以使用GsonBuilder。
Gson gson = new Gson();
- 使用GsonBuilder
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() //不对没有用@Expose注解的属性进行操作
.enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法
.serializeNulls() //当字段值为空或null时,依然对该字段进行转换
.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //时间转化为特定格式
.setPrettyPrinting() //对结果进行格式化,增加换行
.disableHtmlEscaping() //防止特殊字符出现乱码
.registerTypeAdapter(User.class,new UserAdapter()) //为某特定对象设置固定的序列或反序列方式,自定义Adapter需实现JsonSerializer或者JsonDeserializer接口
.create();
2.2.2.注解
public class User {
@Expose
private String firstName;
@Expose(serialize = false)
private String lastName;
@Expose(deserialize = false)
private String emailAddress;
@SerializedName("pwd")
private String password;
}
@Expose
@Expose中serialize和deserialize属性是可选的,默认两个都为true。
如果serialize为true,调用toJson时会序列化该属性,
如果deserialize为true,调用fromJson生成Java对象时不会进行反序列化。@SerializedName
能指定该字段在序列化成json时的名称注意:如果采用new Gson()方式创建Gson,@Expose没有任何效果。需要使用 gsonBuilder.excludeFieldsWithoutExposeAnnotation()方法。
2.2.3.序列化(把Bean转换成Json格式字符串)
//序列化Bean
String jsonStr = gson.toJson(user, User.class);
//序列化集合
String jsonStr2 = gson.toJson(list);
2.2.4.反序列化(json字符串转为对象)
//反序列化Bean
Student user= gson.fromJson(jsonStr, User.class);
//反序列化集合
List<User> retList = gson.fromJson(jsonStr2,new TypeToken<List<User>>(){}.getType());