如何防止Gson将长数字(json字符串)转换为科学记数法格式?

2022-09-01 10:50:22

我需要将json字符串转换为java对象并将其显示为长。json 字符串是长数字的固定数组:

{numbers
[ 268627104, 485677888, 506884800 ] }

要转换的代码在所有情况下都工作正常,但以 0 结尾的数字除外。它将这些转换为科学记数法数字格式:

   public static Object fromJson(HttpResponse response, Class<?> classOf)
    throws IOException {
    InputStream instream = response.getResponseInputStream();                   

    Object obj = null;
    try {
        Reader reader = new InputStreamReader(instream, HTTP.UTF_8);

        Gson gson = new Gson();

        obj = gson.fromJson(reader, classOf); 

        Logger.d(TAG, "json --> "+gson.toJson(obj));
    } catch (UnsupportedEncodingException e) {
        Logger.e(TAG, "unsupported encoding", e);
    } catch (Exception e) {
        Logger.e(TAG, "json parsing error", e);
    }

    return obj;
}

实际结果:Java 对象:268627104,485677888,5.068848E+8

请注意,最后一个数字将转换为科学记数法格式。任何人都可以建议可以做些什么来解决这个问题,阻止它或撤消它?我使用的是 Gson v1.7.1


答案 1

如果序列化为字符串是一个选项,则可以将 GSON 配置为执行以下操作:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setLongSerializationPolicy( LongSerializationPolicy.STRING );
Gson gson = gsonBuilder.create();

这将产生如下结果:

{numbers : [ "268627104", "485677888", "506884800" ] }

答案 2

另一个解决方法是改用 JsonParser 类。这将返回Gson对象表示(JsonElement)而不是用户定义的类,但避免了转换为科学记数法的问题。

import java.lang.reflect.Type;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

public class GsonTest
{
    public static void main(String[] args)
    {
        String json = "{numbers:[268627104,485677888,506884800]}";

        Gson gson = new Gson();
        Type type = new TypeToken<Map<String, Object>>(){}.getType();
        Map<String, Object> jsonMap = gson.fromJson(json, type);
        System.out.println("Gson output:");
        System.out.println(jsonMap);

        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(json);
        System.out.println("JsonParser output:");
        System.out.println(jsonElement);
    }
}

代码输出:

Gson output:  
{numbers=[2.68627104E8, 4.85677888E8, 5.068848E8]}  
JsonParser output:  
{"numbers":[268627104,485677888,506884800]}