有时候我们使用很多地方使用了net.sf对象,但是突然发现精度丢失,如果这时候换成fastjson什么的要改动很多,网上全是换工具,但是我这里换工作量很大,所以可以用如下的做法。
当然这里间接使用了fastjson来作为中转,但是最后得到的依然是net.sf对象
2022-12-26 修复了json字符串中含有浮点数据类型数值丢失精度情况
/**
*
* json格式字符串转换为不丢失精度的net.sf.json格式对象
*
* @param json字符串
* @return
*/
public static JSONObject CNumber(String str){
com.alibaba.fastjson.JSONObject resJsonObjectFJ = com.alibaba.fastjson.JSONObject.parseObject(str);
//由于fastjson并不会把json中含有json字符串的数据自动转换为json对象,因此net.sf拿到的就是字符串对象,所以这里需要进行主动处理
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(String.class, new JsonValueProcessor() {
@Override
public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) {
try {
com.alibaba.fastjson.JSONObject jsonObjectFJ = com.alibaba.fastjson.JSONObject.parseObject(arg1.toString());
JSONObject value = JSONObject.fromObject(jsonObjectFJ,arg2);
return value;
} catch (Exception e) {
// TODO: handle exception
}
try {
com.alibaba.fastjson.JSONArray jsonObjectFJ = com.alibaba.fastjson.JSONObject.parseArray(arg1.toString());
JSONArray value = JSONArray.fromObject(jsonObjectFJ,arg2);
return value;
} catch (Exception e) {
// TODO: handle exception
}
return arg1;
}
@Override
public Object processArrayValue(Object arg0, JsonConfig arg1) {
// TODO Auto-generated method stub
try {
com.alibaba.fastjson.JSONArray jsonObjectFJ = com.alibaba.fastjson.JSONObject.parseArray(arg1.toString());
JSONArray value = JSONArray.fromObject(jsonObjectFJ,arg1);
return value;
} catch (Exception e) {
// TODO: handle exception
}
return arg0;
}
});
JSONObject resJsonObject = JSONObject.fromObject(resJsonObjectFJ,jsonConfig);
return resJsonObject;
}