Java 处理 JSON 数据小结
JSON的格式类型
JSON有三种格式类型:基本类型、数组类型、对象嵌套
基本类型
格式说明:{“键” : 值, “键” : “值”,…},以大括号开始,键的名称加上冒号,然后跟上对应的的值,若有其他键值对则以逗号进行分割。
{
"student": "张三",
"age": 18,
"sex": true
}
数组类型
格式说明:[{“键” : 值, “键” : “值”},{“键” : 值, “键” : “值”},…],以中括号开始,其间的数据通过逗号进行分割。
[
{
"name": "张三",
"age": 18,
"sex": true
},
{
"name": "李四",
"age": 19,
"sex": false
}
]
对象嵌套
由上面两种类型,因为值的不固定性,可以演变出各种各样的嵌套类型。
{
"name": "teacher",
"computer": {
"CPU":"intel7,
"disk": "512G"
},
"students": [
{
"name": "张三",
"age": 18,
"sex": true
},
{
"name": "李四",
"age": 19,
"sex": false
}
]
}
JSON官网介绍可以参考。
使用 com.alibaba.fastjson 转换、解析json数据
POM引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
使用不同对象处理不同类型的JSON数据。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class TestJson {
public static void main(String[] args) {
// json字符串-简单对象型
final String JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";
// json字符串-数组类型
final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";
JSONStrToJSONArray1(JSON_ARRAY_STR);
JSONStrToJSONObject(JSON_OBJ_STR);
}
/**
* 字符串(json数组类型格式)转换成JSONArray类型的json
*/
public static void JSONStrToJSONArray1(String JSON_ARRAY_STR) {
JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
// JSONArray jsonArray1 =JSONArray.parseArray(JSON_ARRAY_STR);//因为JSONArray继承了JSON,所以这样也是可以的
// 遍历方式1
int size = jsonArray.size();
for (int i = 0; i < size; i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
}
// 遍历方式2
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
}
}
/**
* 字符串(json基本类型格式)转换成JSONObject类型的json
*/
public static void JSONStrToJSONObject(String JSON_OBJ_STR) {
JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
//JSONObject jsonObject1 = JSONObject.parseObject(JSON_OBJ_STR); //因为JSONObject继承了JSON,所以这样也是可以的
System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
}
}
若要将一个数据类型格式的json字符串直接转换成一个list:
可以先根据json数组的key新建个 实体类:
public class Student {
private String studentName;
private String studentAge;
}
然后直接调用JSONArray.parseArray() 方法转换成对象list:
public class TestJson{
final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";
public static void JSONStrToJSONArray1(String JSON_ARRAY_STR) {
//直接转换成List
List<IssueType> jsonList = JSONArray.parseArray(JSON_ARRAY_STR,Student.class);
for (int i=0; i< jsonList.size(); i++){
System.out.println(jsonList.get(i));
}
}
public static void main(String[] args) {}
}
使用org.json.JSONArray / org.json.JSONObject 处理json
json字符串与JSONObject互转换
import org.json.JSONException;
import org.json.JSONObject;
public class TestJsonObject {
public static void main(String[] args) throws JSONException {
//记得转义
String jsonStr="{\"studentName\":\"zhangsanfeng\",\"studentAge\":18,\"school\":\"大学\"}";
//利用构造函数直接转换成JSONObject类型对象
JSONObject jsonObj = new JSONObject(jsonStr);
int age = jsonObj.getInt("studentAge");
String studentName= (String) jsonObj.get("studentName");
String school = jsonObj.optString("school");
System.out.println(studentAge);
System.out.println(studentName);
System.out.println(school);
}
//可以用JSONObject类型对象的put方法添加。
private static void jSONObject(){
JSONObject jsonObject = new JSONObject();//new一个JSONObject对象,命名为jsonObject
Object nullObj = null; //解决put中因二义性引起的编译错误
try{
jsonObject.put("name","王小二");
jsonObject.put("age",25.2);
jsonObject.put("birthday","1990-01-01")
jsonObject.put("major",new String[] {"理发","挖掘机"});
jsonObject.put("has_girlfriend",false);
jsonObject.put("car",nullObj);
jsonObject.put("house",nullObj);
System.out.println(jsonObject.toString());//输出JSON格式的wangxiaoer数据
}catch(JSONException e){
e.printStackTrace();
}
}
}
JSON 与 Map 互相转换
import org.json.JSONArray;
import org.json.JSONObject;
public class TestJson {
public static void main(String[] args) {
// json字符串-简单对象型
final String JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";
// json字符串-数组类型
final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";
}
/**
* JSONObject转换Map
*/
public static Map convertJsonObjectToMap(JSONObject json){
Map resultMap = new HashMap();
//获取所有的key的迭代器
Iterator<String> iterator = json.keys();
while (iterator.hasNext()){
String key = iterator.next();
resultMap.put(key,json.opt(key));//调用的是map.get(key)
// resultMap.put(key,json.get(key));//json.get(key)方法底层调用的还是opt(key)
}
return resultMap;
}
/**
* Map转换JSONObject
*/
public static JSONObject convertMapToJsonObject (Map<String,Object> map){
JSONObject jsonObject = new JSONObject();
//获取所有key的集合
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String key = iterator.next();
jsonObject.put(key,map.get(key));
}
return jsonObject;
}
/**
* JsonArray转换MapList
*/
public static List<Map> convertJsonArrayToMapList (JSONArray jsonArray){
Map<String,Object> resultMap = new HashMap<>();
List<Map> list = new ArrayList<>();
for (int i=0; i<jsonArray.length(); i++){
//获取每一个json中的每一个{}
JSONObject json = jsonArray.optJSONObject(i);
//将json的{}转化成map
Map map = convertJsonObjectToMap(json);
//将每一个map存入list中。
list.add(map);
}
return list;
}
}
实际场景json解析
场景1
json格式-基本类型:
{
"student": "张三",
"age": 18,
"sex": true
}
解析方式:
JSONObject jsonObject=JSON.parseObject(result); //转换成object
jsonObject.getString("returnAddress") //获取object中returnAddress字段;
场景2
json格式-嵌套类型:
{
"success":"true",
"data":{
"shop_uid":"123"
}
}
解析方式:
JSONObject shop_user =JSON.parseObject(result);
JSON.parseObject(shop_user.getString("data")).getString("shop_uid")
场景3
json格式-对象嵌套带数组类型:
{
"students": [
{
"student": "张三",
"age": 18,
"sex": true
},
{
"student": "李四",
"age": 19,
"sex": false
}
]
}
解析方式:
JSONObject json = new JSONObject(data);
JSONArray rows = json.optJSONArray("students");
for (int i = 0; i < rows.length(); i++) {
JSONObject row = rows.optJSONObject(i);
//打印出student字段值
System.out.println(row.optString("student"));
}
场景4
直接处理JSONArray格式数据:
处理成List<实体类型>的list。
解析方式:
List<ReasonDTO> ReasonDTOList = new ArrayList<>();
JSONArray array = (JSONArray) dadaApiResponse.getResult();
array.stream().forEach(
i ->{
JSONObject object = JSONArray.parseObject(i.toString());
ReasonDTO cancelReasonDTO = new CancelReasonDTO();
ReasonDTO.setCancelCode((Integer) object.get("id"));
ReasonDTO.setCancelName((String) object.get("reason"));
ReasonDTOList.add(ReasonDTO);
}
);
参考:
https://blog.csdn.net/jike11231/article/details/106230586/