最近接手了一个分期支付业务,要求通过 支付类型、分期的期数 找到对应的 费率 。 涉及到了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%,结果如下
二、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) valuepublic 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)都会抛异常,没有 方括号[ ] 格式不对。