Gson系列6 --- 问题篇 -- GSON处理JSON数据中Long型的数据变成 科学计数法的问题解决方案
程序员文章站
2024-03-16 09:45:52
...
对于 Gson 转换数值long 类型有一定的缺陷,总是转换成科学计数法的形式
Gson 转换long到科学计数法的解决方法
如下json
{"username":"tomcat","uuid":123456789012}
转成的结果
{username=tomcat, uuid=1.23456789012E11}
很明显,不符合我们的要求,
因此需要改变
所需的依赖
<!--json-lib-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
测试代码
package sun.rain.amazing.gson.quest;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.LongSerializationPolicy;
import com.google.gson.reflect.TypeToken;
import net.sf.json.JSONObject;
import org.junit.Test;
import java.util.Map;
/**
* @author sunRainAmazing
*/
public class LongValueTest {
/**
* GSON处理JSON数据中Long型的数据变成 科学计数法的问题解决方案
*
* 1、先转成 JSONObject
* 2、GsonBuilder 设置 Long数值型的转换策略为STRING策略
* 3、gson.toJson(JSONObject)
* 4、再转换成Map<String,Object>
*
* 结果
* {username=tomcat, uuid=1.23456789012E11}
* {username=tomcat, uuid=1.23456789012E11,
* mapObj={tname=jerry, tid=1.11523065825E11}, arg=abc}
*
* {"username":"tomcat","uuid":"123456789012",
* "mapObj":{"tname":"jerry","tid":"111523065825"},"arg":"abc"}
*
* {username=tomcat, uuid=123456789012,
* mapObj={tname=jerry, tid=111523065825}, arg=abc}
*/
@Test
public void testLongValue(){
Gson gson = new Gson();
String json = "{\"username\":\"tomcat\",\"uuid\":123456789012}";
Map<String,Object> res = gson.fromJson(json,
new TypeToken<Map<String,Object>>(){}.getType());
System.out.println(res);
// 原始json,带long类型的数值型
String jsonStr = "{\n" +
"\"username\": \"tomcat\",\n" +
"\"uuid\": 123456789012,\n" +
"\"mapObj\": {\n" +
"\"tname\": \"jerry\",\n" +
"\"tid\": 111523065825\n" +
"},\n" +
"\"arg\": \"abc\"\n" +
"}";
Map<String,Object> resStr = gson.fromJson(jsonStr,
new TypeToken<Map<String,Object>>(){}.getType());
System.out.println(resStr);
// 先转成 JSONObject 对象
JSONObject jsonObject=JSONObject.fromObject(jsonStr);
// 设置 Long数值型的转换策略
Gson gsonBuilder = new GsonBuilder()
.setLongSerializationPolicy(LongSerializationPolicy.STRING)
.create();
String jsonBu = gsonBuilder.toJson(jsonObject);
System.out.println(jsonBu);
//再转成Map对象
resStr = gson.fromJson(jsonBu,
new TypeToken<Map<String,Object>>(){}.getType());
System.out.println(resStr);
// 若 嫌麻烦 -- 可换成其它JSON解析类,如 fastJson, Jackson
}
/**
* json 中没有有嵌套属性 mapObj
* 则可以通过 这种方式解决
* Map<String,String> resStr = gson.fromJson(json,
* new TypeToken<Map<String,String>>(){}.getType());
*/
@Test
public void testStrNoObject(){
// 原始json,带long类型的数值型
String json = "{\"username\":\"tomcat\",\"uuid\":123456789012}";;
Gson gson = new Gson();
Map<String,String> resStr = gson.fromJson(json,
new TypeToken<Map<String,String>>(){}.getType());
System.out.println(resStr);
}
/**
* json 中带有嵌套属性 mapObj
* 使用上面的方式则会出错
* Expected a string but was BEGIN_OBJECT at line 4 column 12 path $.
* 因此, 我们需要转换json,换成我们需要的 格式
*
* @see LongValueTest#testLongValue
*
*/
@Test
public void testStr(){
// 原始json,带long类型的数值型
String jsonStr = "{\n" +
"\"username\": \"tomcat\",\n" +
"\"uuid\": 123456789012,\n" +
"\"mapObj\": {\n" +
"\"tname\": \"jerry\",\n" +
"\"tid\": 111523065825\n" +
"},\n" +
"\"arg\": \"abc\"\n" +
"}";
Gson gson = new Gson();
Map<String,String> resStr = gson.fromJson(jsonStr,
new TypeToken<Map<String,String>>(){}.getType());
System.out.println(resStr);
}
}