Java中JSONObject数据的处理

在日常的工作中,接口开发工作中经常会传递一些JSON类型的数据。

总结自己工作中出现的问题,也是我开始记录的意义。(意识到自己是个菜鸟)

1.举个例子

首先我们先生成一些JSONObject数据(这也是我工作实际用到的数据)

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
       String jsonData = "{\"b\":28.548484106556554,\"de\":-0.15010535898429822,\"dn\":-0.62366083858123034}";
        JSONParser parser = new JSONParser();
        try {
            JSONObject json = (JSONObject) parser.parse(jsonData);

            // 在知道key的情况下,直接取出数据
            System.out.println(json.get("b"));

            // 如果不知道key,可以通过迭代器遍历取数据
            Iterator iterator = json.keySet().iterator();
            while (iterator.hasNext()) {
                String Key = (String) iterator.next();
                System.out.println(Key + "==" + json.get(Key));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

这样我们就拥有JSONObject数据

2.一般情况下都是接收传递为主

展示一下我当时写的代码和优化后的代码

@RequestMapping(value = "/postEndpoint", method = { RequestMethod.POST})
public Result addToDPS(@RequestBody JSONObject requestBody){
    // 将请求体转换为Map对象
    Map<String, Object> map = toMap(String.valueOf(requestBody));
    System.out.println(map);
    Data data = new Data();

    // 遍历Map中的键值对
    for (String mapkey : map.keySet()) {
        Object object = map.get(mapkey);
        // 如果值是BigDecimal类型,则进行处理
        if (object instanceof BigDecimal) {
            // 将BigDecimal转换为指定精度的BigDecimal对象
            BigDecimal bigDecimal = new BigDecimal(String.valueOf(object));
            BigDecimal result = bigDecimal.setScale(6, BigDecimal.ROUND_HALF_UP);
            // 将BigDecimal转换为double类型
            double doubleValue = result.doubleValue();
            // 打印处理后的double值
            System.out.println(doubleValue);
        } else {
            // 如果值不是BigDecimal类型,则直接打印
            System.out.println(object);
        }
    }
}

        这是我经常犯的问题,总想要什么数值就转什么数值,这样无疑是增加开销有两点。

  1. 避免不必要的字符串转换:toMap 方法中,你将 JSONObject 对象转换为字符串,然后再转换为 Map 对象。这里可以直接将 JSONObject 转换为 Map,避免了中间的字符串转换。

  2. 避免多次类型转换: 在遍历 Map 中的值时,对于 BigDecimal 类型的值,你先将其转换为字符串,然后再转换为 BigDecimal,这样做增加了额外的开销。可以直接将 Object 强制转换为 BigDecimal,并进行精度处理。

    @RequestMapping(value = "/postEndpoint", method = { RequestMethod.POST})
    public Result addToDPS(@RequestBody JSONObject requestBody) {
        // 直接将JSONObject转换为Map对象
        Map<String, Object> map = (Map<String, Object>) requestBody;
    
        System.out.println(map);
        Data data = new Data();
    
        // 遍历Map中的键值对
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            Object object = entry.getValue();
            // 如果值是BigDecimal类型,则进行处理
            if (object instanceof BigDecimal) {
                // 将BigDecimal转换为指定精度的BigDecimal对象
                BigDecimal bigDecimal = ((BigDecimal) object).setScale(6, BigDecimal.ROUND_HALF_UP);
                // 将BigDecimal转换为double类型
                double doubleValue = bigDecimal.doubleValue();
                // 打印处理后的double值
                System.out.println(doubleValue);
            } else {
                // 如果值不是BigDecimal类型,则直接打印
                System.out.println(object);
            }
        }
    
        // 这里需要根据实际情况返回相应的Result对象
        return result;
    }
    

    这样优化后的代码将会减少了不必要的中间过程,从而提高了性能。

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值