第一步引入fastjson pom依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
使用场景一 : 假设你需要提取一段json字符串中,相对应的key值得value 可以使用该方法
字符串转化成为JSONObject对象,就可以get到相对应的字段信息
方法一 :
String strA = "{\"department\":\"技术部\"}"
JSONObject jsonObject = JSON.parseObject(strA);
String dept = jsonObject.get("department").toString();
方法二 :
String strB = "{\"department\":\"技术部\",\"data\":"{\"name\:hanqitao",\"age\":\"64\"}"}"
JSONObject jsonObject = JSON.parseObject(strB);
JSONObject data = jsonObject.getJSONObject("data");
//转化成对应的对象
Data dataObject = JSON.toJavaObject(data, Data.class);
使用场景二 : 假设你需要将一个数据字符串转化成一个集合(一个字段一对多的情况)
假设你数据库的某个字段为vachar类型 加如为 [1,2,3,4,],即可get到相关集合
// int类型 :
String str = "[\"1\",\"2\",\"2\",\"3\"]";
List<Integer> urlIds = JSONObject.parseArray(str, Integer.class);
for (String number : urlIds) {
System.out.println(number);
}
// String类型:
String str = "[\"asd\",\"asd123\",\"hanqitao\",\"感觉不错啊\"]";
List<String> urlIds = JSONObject.parseArray(str, String.class);
for (String number : urlIds) {
System.out.println(number);
}
//也能转化成自己想要的对象集合
JSONObject jsonObject = JSONObject.parseObject(resp);;
Object userlist = jsonObject.get("userlist");
List<WxUserVo> wxUserVos = JSONObject.parseArray(userlist.toString(), WxUserVo.class);
使用场景三 : 你需要给前端一个Json字符串,但是你不想封装多个对象返回出去,那么你也可以使用该工具类(接收的字符串有对象,大对象中包裹着很多小对象的场景)
这边你只要返回的是JSONObject出去,那么前端接收到的就是json字符串形式
就减少给后台开发人员封装对象的繁琐事情了
//创建一个JSONObject对象
JSONObject jsonObject = JSON.parseObject("");
//远端返回的json字符串
String policyResp = HttpUtil.doPostByJson(policyUrl + "queryPolicyList", smspPolicyRequest);
if (!StringUtils.isEmpty(policyResp)) {
//进行转化变成JSONObject
JSONObject jsonObj = JSON.parseObject(policyResp);
jsonObject = jsonObj.getJSONObject("data");
if (null != jsonObject) {
return jsonObject;
}
}else {
log.error("policyResp为空 : " + policyResp);
}
return jsonObject;
使用场景四 : 我想将JSONObject转化成map形式可以吗,然后再使用map中的基本操作
说明: 本质上json字符串它就属于map类型相似,只是会有特殊的\反编译斜杠,这时候你就可以用map中的常规操作了,remove,put,然后你也可以变回Json对象返回给前端
//直接强转
JSONObject jsonObject = JSONObject.fromObject(json);
Map<String, Object> map = (Map)jsonObject;
{
"北京": {
"val": "110000",
"items": {
"东城区": "110101",
"西城区": "110102",
"崇文区": "110103",
"宣武区": "110104",
"朝阳区": "110105",
"丰台区": "110106",
"石景山区": "110107",
"海淀区": "110108",
"门头沟区": "110109",
"房山区": "110111",
"通州区": "110112",
"顺义区": "110113",
"昌平区": "110114",
"大兴区": "110115",
"怀柔区": "110116",
"平谷区": "110117",
"密云县": "110228",
"延庆县": "110229"
}
},
"天津": {
"val": "120000",
"items": {
"和平区": "120101",
"河东区": "120102",
"河西区": "120103",
"南开区": "120104",
"河北区": "120105",
"红桥区": "120106",
"塘沽区": "120107",
"汉沽区": "120108",
"大港区": "120109",
"东丽区": "120110",
"西青区": "120111",
"津南区": "120112",
"北辰区": "120113",
"武清区": "120114",
"宝坻区": "120115",
"宁河县": "120221",
"静海县": "120223",
"蓟县": "120225",
"滨海新区": "120226"
}
}
}
public static List<City> convertJson(String json){
JSONObject jsonObject = JSONObject.fromObject(json);
Map<String, Object> map = (Map)jsonObject;
List<City> cityList=new ArrayList<>();
for (String cityname : map.keySet()) {
Object zijson = map.get(cityname);
City city = JSON.parseObject(zijson+"",City.class);
city.setName(cityname);
String items = city.getItems();
JSONObject areajson = JSONObject.fromObject(items);
Map<String,Object> map2 = (Map)areajson;
List<Area> areasList=new ArrayList<>();
for (String quName : map2.keySet()) {
Area area = new Area();
area.setName(quName);
Object quCode = map2.get(quName);
area.setCode(Integer.parseInt(quCode+""));
areasList.add(area);
}
city.setAreas(areasList);
cityList.add(city);
}
return cityList;
}
拓展
说明 : 作者遇到过kafka推送过来的字符串,转化成相对应JSONObject对象,这边有个坑,你需要用校验的方式才能进行接收对应的数据,否则无法接收到对应的数据
if (jsonData.endsWith("") && jsonData.startsWith(""))
/*
* 消费者监听器
* @param jsonData
*/
@KafkaListener(topics = AppConstants.GD_TOPIC)
public void receive (String jsonData) {
if (IFNull.strIfNull(jsonData)) {
log.error("kafka 数据异常 : " + jsonData);
return;
}
log.info("接收总部推送kafka数据---->" + jsonData);
if (jsonData.endsWith("") && jsonData.startsWith("")) {
JSONObject jsonObject = JSON.parseObject(jsonData);
JSONObject body = jsonObject.getJSONObject("body");
if (null != body) {
zbKafkaService.receiveZbData(body);
}
}else {
log.error("kafka 数据异常 : " + jsonData);
}
}
还有一种场景,有多个大对象嵌套怎么获取到小对象里面的值呢?
比如我想获取 RESULTDESC 这个字段的值?
{
"responsehead":{
"server__version":"00000001",
"request__type":"123456",
"sender":"club",
"response__code":"0001",
"uuid":"abcdef",
"error__message":"无对应产品信息!",
"timestamp":"2021-05-25 09:35:13.336 UTC"
},
"BODY":{
"BUSINESSLIST":{
"BUSINESSDATA":{
"RESULTCODE":"001",
"RESULTDESC":"无对应产品信息!"
}
}
"HANQITAO":[
"A":{
"RESULTDESC":"无对应产品信息!"
}
]
}
}
解决方法 :
String o = jsonObject.getJSONObject("BODY").getJSONObject("BUSINESSLIST").getJSONObject("BUSINESSDATA").getString("RESULTCODE");
System.out.println(o);
总结
//Object转JSON字符串:
String jsonStr = JSONObject.toJSONString(object);
//JSON字符串转JSONObject:
JSONObject jsonObject = JSONObjcet.parseObject(jsonStr);
//某个对象转化成JSONObject对象
JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(object));
JSON字符串转Object对象
T t = JSON.parseObject(jsonStr,T.class);
1、//将map转换成jsonObject
JSONObject itemJSONObj = JSONObject.parseObject(JSON.toJSONString(itemMap));
将Map类型的itemInfo转换成json,再经JSONObject转换实现。
2、//将jsonObj转换成Map
Map<String, Object> itemMap = JSONObject.toJavaObject(itemJSONObj, Map.class);
//JOSN.parseObjet()方法同样可以转换