欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
    }
}