在日常的工作中,接口开发工作中经常会传递一些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);
}
}
}
这是我经常犯的问题,总想要什么数值就转什么数值,这样无疑是增加开销有两点。
-
避免不必要的字符串转换: 在
toMap
方法中,你将JSONObject
对象转换为字符串,然后再转换为Map
对象。这里可以直接将JSONObject
转换为Map
,避免了中间的字符串转换。 -
避免多次类型转换: 在遍历
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; }
这样优化后的代码将会减少了不必要的中间过程,从而提高了性能。