1. JSON是什么
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,本质就是具有特定格式的字符串,常用于客户端和服务器端交换数据。
2. JSON数据格式
json数组:[value1, value2, value3] ,对应Java里的数组或list
json对象:{key1:value1, key2:value2, key3:value3},对应Java里的Map或自定义对象
key数据类型:字符串
value数据类型:数值、字符串、null、json数组[]、json对象{}
例如:[1, “ab”, [], {“n”:123, “b”:”abc”}]
3. 解析方式
3.1 Android原生API
JsonObject:json对象{}
JSONObject(String json):将json字符串解析为json对象
Xxx getXxx(String name):根据name,在json对象中得到对应的value
JsonArray:json数组[]
JSONArray(String json):将json字符串解析为json数组
int length():得到json数组中元素的个数
Xxx getXxx(int index):根据下标得到json数组中对应的元素数据
3.2 Gson框架
Gson():构造对象的方法
String toJson(Object src):将对象转换为对应格式的json字符串
T fromJson(String json, Type typeOfT):解析Json字符串,得到对象
TypeToken<T>:用来得到Type的类
4. JSON字符串转换为Java对象
4.1 使用原生API
String jsonString = "{\"id\":1, \"name\":\"one\", \"grade\":100}";
// 1.将json字符串转换为JSONObject对象
JSONObject jsonObject = new JSONObject(jsonString);
// 2.根据key得到相应的value
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
int grade = jsonObject.getInt("grade");
// 3.封装为Student对象
Student student = new Student(id, name, grade);
4.2 使用GSon
String jsonString = "{\"id\":1, \"name\":\"one\", \"grade\":100}";
Student student = new Gson().fromJson(jsonString, Student.class);
5. JSON字符串转换为Java对象的List
5.1 使用原生API
String jsonString = "[{\"id\":1, \"name\":\"one\", \"grade\":100}, {\"id\":2, \"name\":\"two\", \"grade\":99}]";
List<Student> list = new ArrayList<Student>();
// 1.将json字符串转换为JSONArray对象
JSONArray jsonArray = new JSONArray(jsonString);
// 2.遍历JSONArray对象所有元素,将每个元素封装为Student对象
for(int i = 0; i < jsonArray.length(); i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 3.根据key得到相应的value
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
int grade = jsonObject.getInt("grade");
// 4.封装为Student对象
Student student = new Student(id, name, grade);
// 5.添加到List中
list.add(student);
}
5.2 使用Gson
String jsonString = "[{\"id\":1, \"name\":\"one\", \"grade\":100}, {\"id\":2, \"name\":\"two\", \"grade\":99}]";
List<Student> list = new Gson().fromJson(jsonString, new TypeToken<List<Student>>(){}.getType());
6.使用Gson将Java对象转换为json字符串{}
Student student = new Student(1,"one",100);
String jsonString = new Gson().toJson(student);
7.使用Gson将Java对象的List转换为json字符串[]
List<Student> list = new ArrayList<Student>();
list.add(new Student(1,"one",100));
list.add(new Student(2,"two",99));
String jsonString = new Gson().toJson(list);
8.使用Map封装json对象key的特殊情况
当一些json字符串中的对象属性名很特殊,如包含空格或仅为数字时,不能直接将json字符串转换为Java对象,而是要将其转换为Map:
String jsonString = "{\"my id\":1, \"my name\":\"one\", \"my grade\":100}";
Map<String, Object> map = new Gson().fromJSon(jsonString, new TypeToken<Map<String, Object>>(){}.getType());