JSONObject和JSONArray的用法和业务场景

最近接手了一个分期支付业务,要求通过 支付类型分期的期数 找到对应的 费率 。 涉及到了JSONObject、JSONArray的使用。

引入fastjson的依赖,将下面的代码复制粘贴到pom.xml的<dependencies>... </dependencies>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.46</version>
</dependency>          

一、业务场景应用

分期支付业务传入的json串如下:

{
    
    
	"花呗": [{
    
     //分期支付产品类型
		"instalmentNum": "6期",  //分期的期数
		"repaymentRate": "20.50%" //费率
	}, {
    
    
		"instalmentNum": "12期",
		"repaymentRate": "25.00%"
	}, {
    
    
		"instalmentNum": "24期",
		"repaymentRate": "13.00%"
	}, {
    
    
		"instalmentNum": "36期",
		"repaymentRate": "18.00%"
	}]
}

(上面的数值随便造的哈,重点是下面如何使用JSONObject和JSONArray)

现在我要通过 分期支付类型(某呗)、分期的期数(6期) 来查找到对应的 费率20.50%

取出 费率20.50% 的步骤:

  • 先拿到花呗对应的value:{“花呗”:value } 整体 是一个JSONObject,是键值对的形式
  • "花呗"对应的 value 是一个JSONArray,形式如: [ {key:value}, {}, {} ],其中 方括号 代表的就是一个JSONArray,数组里面的 每一项也是一个键值对的形式 { key: value },类型是一个java.lang.Object

项目用的是fastjson,所以下面的方法也是基于这个jar包的


//入参repaymentRate是上面的那个json串
private static matchRepaymentRate(String repaymentRate){
    
    
	//先拿到repaymentRate对应的json键值对形式{ "花呗": value }
	JSONObject jsonObject=JSONObject.parseObject(repaymentRate);
	//再拿到key(花呗)对应的value,是一个JSONArray,形如[{key:value},{..},{..}]
	JSONArray jsonArray=jsonObject.getJSONArray("花呗");
	for(int i=0;i<jsonArray.size();i++){
    
    
		 //得到数组的第i个元素,即{"instalmentNum": "6期","repaymentRate": "20.50%"}
         JSONObject jsonObj= jsonArray.getJSONObject(i);
         String instalmentNum=jsonObj.getString("instalmentNum");
         if(instalmentNum.equals("6期")){
    
    
             System.out.println("分期支付的类型是花呗 、分期6期得到的费率为:"+jsonObj.getString("repaymentRate"));
         }
    }
}

支付类型(某呗)+ 6期分期 => 费率为20.50%,结果如下

支付类型花呗+6期分期得到对应的费率

二、JSONObject

JSONObject是键值对,形如 { key : value },以后看到用 { }大括号 就可视为一个JSONObject,

内部其实是一个Map<String, Object> map,可以是HashMap,亦或LinkedHashMap

构造方法

  • 默认构造:得到的是一个初始容量为16的HashMap,public JSONObject() { this(16, false); } 其中 false是构造HashMap,true构造的是LinkedHashMap
  • 人为指定是构造HashMap或者是LinkedHashMap(但不能指定初始容量):public JSONObject(boolean ordered) { this(16, ordered); }
  • 人为指定HashMap的容量(不能是LinkedHashMap):public JSONObject(int initialCapacity)
  • 同时可指定初始容量和容器类型:
public JSONObject(int initialCapacity, boolean ordered) {
    
    
     if (ordered) {
    
    
        this.map = new LinkedHashMap(initialCapacity);
     } else {
    
    
        this.map = new HashMap(initialCapacity);
     }
}

JSONObject常用的API

  • public Object get(Object key):调用了Map.get(key)方法
  • public JSONObject getJSONObject(String key):获得一个JSONObject对象,因为Map<Stirng,Object>的value是Object,所以返回时要 强制转换为JSONObject,即(JSONObject) value
  • public JSONArray getJSONArray(String key) :获得一个JSONArray数组,方法会返回一个 (JSONArray) map.get(key)

还有其他的getString(String key)、getDouble(String key)都是把Object value转变为相应的类型返回

三、JSONArray

JSONArray本质是一个List<Object> ,后面的API也是基于List 的操作

构造方法

它的构造方法有三个:

  • 默认构造:public JSONArray() { this.list = new ArrayList(); }
  • 可传入一个List集合的构造:public JSONArray(List<Object> list) { this.list = list; }
  • JSONArray(int initialCapacity) 设置List 初始容量

JSONArray常用的API

  • JSONObject getJSONObject(int index) 获得指定位置的元素,用了强制类型转换: (JSONObject) list.get(index)
  • JSONArray getJSONArray(int index):获得的指定位置的元素是(JSONArray) list.get(index),一个JSONArray数组
  • String getString(int index):返回指定位置的元素,将原始的Object元素转变为String元素
  • JSONArray getJSONArray(int index):获得 内层嵌套 的JSON数组,比如这种:
{
    
    
	"成绩排名":[   //外层json数组
		{
    
    
			"第一名":[{
    
    "姓名":"小明"},{
    
    "学号":"1"}]  //内层json数组
		},{
    
    
			"第二名":[{
    
    "姓名":"二狗子"},{
    
    "学号":"2"}]
		}
	]
}

json串里面嵌套了2层JSONArray,有2层方括号 [ ]
我要知道第一名是谁的话,操作如下:

String str ="{\"成绩排名\": ... }"
JSONObject jsonObject=JSON.parseObject(str);
//拿到了外层json数组:[{"第一名":[{"姓名":"小明"},{"学号":"1"}]}, {..}]
JSONArray jsonArray=jsonObject.getJSONArray("成绩排名");
for(int i=0;i<jsonArray.size();i++){
    
    
	JSONObject jsonObj=jsonArray.getJSONObject(i);
	//拿到了内层的json数组:[{"姓名":"小明"},{"学号":"1"}]
	JSONArray jsonArr =jsonObj.getJSONArray("第一名");
    for(int j=0;jsonArr!=null&&j<jsonArr.size();j++){
    
    
    	//拿到了JSONObject {"姓名":"小明"}
    	JSONObject json =jsonArr.getJSONObject(j);
    	System.out.println(json.getString("姓名"));
    }
}

JSONObject和JSONArray的使用

(1)在一个json对象中添加键值对,在JSONArray数组中添加 json对象

//json添加键值对
JSONObject jsonObject=new JSONObject();
jsonObject.put("key","value");

//在JSONArray添加json对象
JSONArray jsonArray=new JSONArray();
jsonArray.add(jsonObject);

(2)String类型的json串转换为JSONObject和JSONArray

① String转换为JSONObject

String str = "{ \"name\":\"小明\" }";
JSONObject jsonObject=JSON.parseObject(str);

② String转换为JSONArray

String str = "[{ \"name\":\"小明\" }]";
JSONArray jsonArray=JSON.parseArray(str);
System.out.println( jsonArray.getJSONObject(0));

输出结果:{“name”:“小明”},如果json串没有 "[ ]"方括号的话,是 没法从指定位置获取元素 的,无论是jsonArray.get(0)或者是jsonArray.getJSONObject(0)都会抛异常,没有 方括号[ ] 格式不对。

猜你喜欢

转载自blog.csdn.net/qq_44384533/article/details/111152885