众所周知,Json这种数据结构非常灵活,可扩展性强,可编辑性也强。
尤其是有一些有关属性的字段,比如同样作为打折方式,部分产品是满减,部分产品是百分比折扣,将来还可以裂变成更灵活的打折方式,那么在设计字段时,可以用一个json表示其打折方式,不用添加字段来表示新的打折方式。
但是在从数据中取出json字段并处理的时候,发现了一个问题,数据表如下:
表示的意思是,
{
"mode":"满减打折",
"details":[
{
"order":0,
"discountPercent":10,
"min":0,
"max":100
},
{
"order":1,
"discountPercent":15,
"min":100,
"max":500
}
]
}
使用的JSON工具包依赖如下:
阿里巴巴的包,挺好用的,功能很强大
"com.alibaba:fastjson:1.2.68"
JOPO类:
import lombok.Data;
/**
* @Author: caicai
* @Date: 2022/3/1 下午5:02
*/
@Data
public class Discount {
private String mode;
private Integer order;
private Integer discountDiscount;
private Integer min;
private Integer max;
}
用法
使用方法如下:
@Test
public void test1(){
String text = "{\"mode\":\"满减打折\",\"details\":[{\"order\":0,\"discountPercent\":10,\"min\":0,\"max\":100},{\"order\":1,\"discountPercent\":15,\"min\":100,\"max\":500}]}";
JSONObject jsonObject = JSONObject.parseObject(text);
String arrayStr = jsonObject.getString("details");
List<Discount> list = JSONObject.parseArray(arrayStr,Discount.class);
for(Discount discount:list){
System.out.println(discount.toString()+"-------------");
}
}
@Test
public void test2(){
String text = "{\"mode\":\"满减打折\",\"details\":[{\"order\":0,\"discountPercent\":10,\"min\":0,\"max\":100},{\"order\":1,\"discountPercent\":15,\"min\":100,\"max\":500}]}";
JSONObject jsonObject = JSONObject.parseObject(text);
JSONArray jsonArray = jsonObject.getJSONArray("details");
for(int i = 0; i< jsonArray.size(); i++){
// 写法一:
// Discount discount = (Discount) jsonArray.get(i);
// 写法二:
JSONObject json = jsonArray.getJSONObject(i);
Discount discount = json.toJavaObject(Discount.class);
System.out.println(discount.toString()+"------------------");
}
}
区别
parseArray("[{},{}]")
parseArray是一个静态方法,传入一个字符串,Api提供专门的解析器对字符串进行解析,并且,解析的内容一定要是jsonArray结构,既[{“key”:“value”},{“key”:“value”}],如果字符串的结构错误,解析时会报错。
getJSONArray(“listName”)
getJSONArray是JSONObject对象的一个成员方法,已经有一个对象了,这个对象内置的是一个map,当这个对象被初始化的时候,内部的map数据结构已经形成,而getJSONArray方法是根据key去一个数据结构为JSONArray的value。