使用fastjson时,如何解析json格式的字符串

为什么会有解析json的应用场景?

        在之前关于json介绍的博客中(https://blog.csdn.net/my_name_is_zwz/article/details/81126357)也提到了json的作用,而当两方通过json数据格式进行数据传输时,一方拿到json格式的数据之后当然要对其进行解析。

代码如下:

package com.json;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class JsonTest {
	// 解析json(最复杂的解析方法)
	public static void jieXIJSON() {
		String jsonStr = "{\"errorCode\":\"0\",\"errorMsg\" :\"调用接口成功\",\"data\":[{\"username\":\"张文哲\",\"position\":\"student\"}]}";//为了避免二义性,字符串里面的双印号使用了\转义字符
		JSONObject root = new JSONObject().parseObject(jsonStr);// 将json格式的字符串转换成json
		
		String errorCode = root.getString("errorCode");//定义一个字符串,其值为根据json对象中的数据名解析出的其所对应的值
		String errorMsg = root.getString("errorMsg");
		System.out.println("errorCode=" + errorCode + ";errorMsg=" + errorMsg);
		
		JSONArray dataArr = root.getJSONArray("data");//根据json对象中数组的名字解析出其所对应的值
		System.out.println(dataArr);
		
		//对解析出的数组进行遍历
		for (int i = 0; i < dataArr.size(); i++) {
			JSONObject dataBean = (JSONObject) dataArr.get(i);//得到数组中对应下标对应的json对象
			
			String username = dataBean.getString("username");//根据json对象中的数据名解析出相应数据
			String position = dataBean.getString("position");
			
			System.out.println(username);//打印输出
			System.out.println(position);
		}
	}

	public static void main(String[] args) {
		jieXIJSON(); 
	}
}

其打印输出结果为:

errorCode=0;errorMsg=调用接口成功
[{"position":"student","username":"张文哲"}]
张文哲
student

以上这种解析json对象的方法较为麻烦,代码较多且复杂。可以利用java的反射机制通过把json对象解析成实体类对象的方式来解析json。

首先这里有两个实体类:

package com.json;

import java.util.ArrayList;
import java.util.List;

public class RootEntity {
	private String errorCode;
	private String errorMsg;
	private List<UserEntity> data;
	public String getErrorCode() {
		return errorCode;
	}
	public void setErrorCode(String errorCode) {
		this.errorCode = errorCode;
	}
	public String getErrorMsg() {
		return errorMsg;
	}
	public void setErrorMsg(String errorMsg) {
		this.errorMsg = errorMsg;
	}
	public List<UserEntity> getData() {
		return data;
	}
	public void setData(List<UserEntity> data) {
		this.data = data;
	}
}
package com.json;

public class UserEntity {
	private String username;
	private String position;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPosition() {
		return position;
	}
	public void setPosition(String position) {
		this.position = position;
	}
}

解析json字符串的代码:

package com.json;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class JsonTest {

	// 解析json(简单的解析方法,也就是通过json转实体类)
	public static void jsonToBean() {
		String jsonStr = "{\"errorCode\":\"0\",\"errorMsg\" :\"调用接口成功\",\"data\":[{\"username\":\"张文哲\",\"position\":\"student\"}]}";
		RootEntity rootEntity = new JSONObject().parseObject(jsonStr,RootEntity.class);//将json字符串转换成json对象,并通过java的反射机制创建相应的实例
		
		System.out.println(rootEntity.getErrorCode());
		System.out.println(rootEntity.getErrorMsg());
		System.out.println(rootEntity.getData());
	}

	public static void main(String[] args) {
		jsonToBean();
	}
}

其运行结果如下:

0
调用接口成功
[com.json.UserEntity@3f78807]

但是使用这种方法解析json字符串时一定要注意:

         所对应的类的属性名称和json数据格式中的数据属性名称一定要保持一致(原因:其使用了java反射机制)

没有更多推荐了,返回首页