JSONObject类
JSON的子类,底层实现了map接口
主要用途
JSONObject相当于json对象,该类中主要封装了各种get方法,通过"键:值"对中的键来获取其对应的值。
举例
获取以下的value
代码思路:json字符串先转成JSONObject对象,在用其get方法获取到值
private static final String JSON_OBJ_STR = "{ \"contentName\":\" 我是内容名称\"," + "\"frepType\": \"DEFAULT\"}";
// json字符串与JSONObject之间的转换
public static void JsonStrToJSONObject() {
JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
System.out.println("contentName: " + jsonObject.getString("contentName") + "," + "frepType: "
+ jsonObject.getString("frepType"));
}
执行结果
JSONArray类
JSON的子类,底层实现了list接口
主要用途
JSONArray代表json对象数组,json数组对象中存储的是一个个json对象,所以类中的方法主要用于直接操作json对象,比如add()和remove()等等。里面也会有get(),但更多使用的场景是getJSONObject(int index),可以获取指定位置的JSONObject对象,配合for循环或者迭代器
举例:
获取数组里面的值
代码思路
public static void JSONArrayToJSONStr() {
// 将json数字字符串转化为JSONArray
JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
/**
* 处理思路:
* 看到方括号就反应过来是要用JSONArray来接收准备要解析的数组字符串JSON_ARRAY_STR,具体是get(*)来获取指定位置的对象
* JSONArray实际上是一个list,那就对应有两种方式来取值:for循环和迭代器
* 看到花括号就要反应过来是JSONObject,利用其get方法来获取value
*
*/
// for循环
// for(int i = 0;i < jsonArray.size;i++){
// JSONObject jsonObject = jsonArray.getJSONObject(i);
// System.out.println("subjectName: " + jsonObject.getString("subjectName") +
// ",subjectId: " + jsonObject.getLong("subjectId"));
// }
// 迭代器
Iterator<Object> iterator = jsonArray.iterator();
while (iterator.hasNext()) {
JSONObject jsonObject = (JSONObject) iterator.next();
System.out.println("subjectName: " + jsonObject.getString("subjectName") + ",subjectId: "
+ jsonObject.getLong("subjectId"));
}
}
执行结果
JSON类
主要用途
实现json对象,json对象数组,javabean对象三个和json字符串之间的相互转化
都是用toJSONString这个方法
举例
public static void JSONObjectToJSONString() {
//将json字符串转为json对象
JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
//将json对象转化成json字符串
String s = JSON.toJSONString(jsonObject);
System.out.println(s);
// 将json数字字符串转化为JSONArray
JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
// 将JSONArray转化为json数字字符串
System.out.println(JSON.toJSONString(jsonArray));
}
那么来看一段复杂的json解析出来,完整的操作一下
如下,要取这个值
代码过程如下
private static final String JSON_HARD_js = "{\"cdpContents\":[{\"cities\":{\"all\":\"全国\"},\"contentMaterials\":[{\"clickUrl\":\"www.baidu.com\",\"materialType\":\"IMAGE_URL\",\"materials\":\"1\"}],\"contentSubTime\":[],\"contentName\":\"我是内容名称\",\"frepType\":\"DEFAULT\",\"gmtEnd\":\"20180627235959\",\"gmtStart\":\"20180627000000\",\"officialContentId\":\"\",\"spaceAttribute\":{}}]}";
//花括号用JSONObject来接收,方括号用JSONArray来接收
public static void Parse_demo() {
JSONObject json_one = JSON.parseObject(JSON_HARD_js);
JSONArray one_value = json_one.getJSONArray("cdpContents");
System.out.println(JSON.toJSONString(one_value));
JSONObject two_value = one_value.getJSONObject(0);
System.out.println(JSON.toJSONString(two_value));
JSONArray three_value = two_value.getJSONArray("contentMaterials");
System.out.println(JSON.toJSONString(three_value));
JSONObject four_value = three_value.getJSONObject(0);
System.out.println(JSON.toJSONString(four_value));
System.out.println(four_value.getString("materialType"));
}
结果如下(注意左侧的花括号和方括号)
控制台查看逐步解析的过程
JavaBean——JSON字符串转为JavaBean(推荐反射方法)
定义:
1、这个类必须具有一个公共的(public)无参构造函数;
2、所有属性私有化(private);
3、私有化的属性必须通过public类型的方法(getter和setter)暴露给其他程序,并且方法的命名也必须遵循一定的命名规范。
4、这个类应是可序列化的。(比如可以实现Serializable 接口,用于实现bean的持久性)
简单的理解是这个类是是要按照一定规范来写,关注它本身——它实际上还是一个类。
那么我们定义一个Activity类
注意:
这边必须重写toString的方法
public class Activity {
public String getActivityNname() {
return activityName;
}
public void setActivityNname(String activityNname) {
this.activityName = activityNname;
}
public int getActivityNumber() {
return activityNumber;
}
public void setActivityNumber(int activityNumber) {
this.activityNumber = activityNumber;
}
private String activityName;
private int activityNumber;
public Activity(String activityName, int activityNumber) {
this.activityName = activityName;
this.activityNumber = activityNumber;
}
public String toString() {
System.out.println(
"Activity{" + "activityName='" + activityName + '\'' + ", activityNumber=" + activityNumber + '}');
return "Activity{" + "activityName='" + activityName + '\'' + ", activityNumber=" + activityNumber + '}';
}
}
运行结果:
再看第二种方式:
通过反射来实现转化
Activity activity_Gson = JSON.parseObject(JSON_OBJ_STR2, Activity.class);
activity_Gson.toString();
运行结果:
最后看第三种方式:
使用TypeReference
Activity activity_tr = JSON.parseObject(JSON_OBJ_STR2, new TypeReference<Activity>() {
});
activity_tr.toString();
运行结果