JSONObject使用场景(特别好用)

第一步引入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()方法同样可以转换

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值