Gson系列6 --- 问题篇 -- GSON处理JSON数据中Long型的数据变成 科学计数法的问题解决方案

对于 Gson 转换数值long 类型有一定的缺陷,总是转换成科学计数法的形式

Gson 转换long到科学计数法的解决方法

 

如下json

{"username":"tomcat","uuid":123456789012}

转成的结果

{username=tomcat, uuid=1.23456789012E11}

很明显,不符合我们的要求,

 

因此需要改变

所需的依赖

        
        
            net.sf.json-lib
            json-lib
            2.4
            jdk15
        

        
        
            com.google.code.gson
            gson
            2.8.5
        

测试代码

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
     * 
     * 结果
     * {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 res = gson.fromJson(json,
                new TypeToken>(){}.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 resStr = gson.fromJson(jsonStr,
                new TypeToken>(){}.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>(){}.getType());
        System.out.println(resStr);

        // 若 嫌麻烦  -- 可换成其它JSON解析类,如 fastJson, Jackson
    }

    /**
     * json 中没有有嵌套属性 mapObj
     * 则可以通过 这种方式解决
     * Map resStr = gson.fromJson(json,
     *   new TypeToken>(){}.getType());
     */
    @Test
    public void testStrNoObject(){
        // 原始json,带long类型的数值型
        String json = "{\"username\":\"tomcat\",\"uuid\":123456789012}";;
        Gson gson = new Gson();
        Map resStr = gson.fromJson(json,
                new TypeToken>(){}.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 resStr = gson.fromJson(jsonStr,
                new TypeToken>(){}.getType());
        System.out.println(resStr);
    }
}

 

你可能感兴趣的:(Gson系列)