笔者最近参加了一次校招,HR问我XML解析,而且还抠细节,自我从JavaWEB转入Android以来就没用过XML解析,我勒个去忘光了。他不知道现在企业里与Android端交互数据的基本都用JSON么!
不多说了,下面看代码,这是我总结的JSON解析的7种情况(非常完整)。读者可以稍作整理,做成一个工具类。
/**
* @author 换煤气
* ☆☆☆json数组对应java中的list或数组
* ☆☆☆json对象对应java中的map或自定义对象
*
* 1. 将json格式的字符串{}转换为Java对象, 使用原生API
* 2. 将json格式的字符串{}转换为Java对象, 使用GSON
* 3. 将json格式的字符串[]转换为Java对象的List, 使用原生API
* 4. 将json格式的字符串[]转换为Java对象的List, 使用GSON
* 5. 将Java对象转换为json字符串{}, 使用GSON
* 6. 将Java对象的List转换为json字符串[], 使用GSON
* 7.将json格式的字符串{}转化为java中的map,(key为特殊字符时)
*
*/
public class JsonParsing extends AndroidTestCase{
/*
* [1]将json格式的字符串{}转换为Java对象, 使用原生API
*/
public void jsontoObjectbyAPI() throws JSONException{
String jsonString = "{\"name\":\"Tome\",\"age\":19,\"sex\":\"man\"}";
//获取jsonObject对象
JSONObject jsonObject = new JSONObject(jsonString);
//获取json对象的values值
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
String sex = jsonObject.getString("sex");
//转化成自定义对象
Student student = new Student(name,age,sex);
Log.e("TAG", student.toString());
}
/*
* [2]将json格式的字符串{}转换为Java对象, 使用GSON
*/
public void jsontoObjectbyGSON(){
String jsonString = "{\"name\":\"Tome\",\"age\":19,\"sex\":\"man\"}";
Student student = new Gson().fromJson(jsonString, Student.class);
Log.e("TAG", student.toString());
}
/*
* [3]将json格式的字符串[]转换为Java对象的List, 使用原生API
*/
public void jsontolistbyAPI() throws JSONException{
String jsonString = "[{\"name\":\"Tome\",\"age\":19,\"sex\":\"man\"}," +
"{\"name\":\"Locy\",\"age\":17,\"sex\":\"women\"}," +
"{\"name\":\"jery\",\"age\":20,\"sex\":\"man\"}]";
List<Student> list = new ArrayList<Student>();
JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
String sex = jsonObject.getString("sex");
Student student = new Student(name, age, sex);
list.add(student);
}
Log.e("TAG", list.toString());
}
/*
* [4]将json格式的字符串[]转换为Java对象的List, 使用GSON
*/
public void jsontolistbyGSON(){
String jsonString = "[{\"name\":\"Tome\",\"age\":19,\"sex\":\"man\"}," +
"{\"name\":\"Locy\",\"age\":17,\"sex\":\"women\"}," +
"{\"name\":\"jery\",\"age\":20,\"sex\":\"man\"}]";
List<Student> list = new Gson().fromJson(jsonString, new TypeToken<List<Student>>(){}.getType());
Log.e("TAG", list.toString());
}
/*
* [5]将Java对象转换为json字符串{}, 使用GSON
*/
public void objecttojsonbyGSON(){
Student student = new Student("Tom", 13, "man");
String jsonString = new Gson().toJson(student);
Log.e("TAG", jsonString);
}
/*
* [6]将Java对象的List转换为json字符串[], 使用GSON
*/
public void listtojsonbyGSON(){
List<Student> list = new ArrayList<Student>();
list.add(new Student("Tome", 17, "man"));
list.add(new Student("lucy", 14, "women"));
String jsonString = new Gson().toJson(list);
Log.e("TAG", jsonString);
}
/*
* [7]当json对象中的key出现数字或者空格等在java里无法定义的标识符,我们可以考虑将其转化为map。
* 其实将json对象转化为map比转化为自定义对象更加方便,只是不够形象直观。
*/
public void jsontomapbyGSON(){
String jsonString = "{\"name\":\"Tome\",\"real age\":19,\"00xx\":\"man\"}";
Map<String,Object> map = new Gson().fromJson(jsonString, new TypeToken<Map<String,Object>>(){}.getType());
Log.e("TAG", map.toString());
}
public void jsontolistmapbyGSON(){
String jsonString = "[{\"name1\":\"Tome\",\"age\":19,\"1 sex\":\"man\"}," +
"{\"name2\":\"Locy\",\"age\":17,\"1 sex\":\"women\"}," +
"{\"name3\":\"jery\",\"age\":20,\"1 sex\":\"man\"}]";
List<Map<String,Object>> list = new Gson().fromJson(jsonString, new TypeToken<List<Map<String,Object>>>(){}.getType());
Log.e("TAG", list.toString());
}
}