2017-08-17 46 views
3

复杂的JSON字符串,我想将它转化成地图,
我有一个问题。
请看看这个简单的测试:Java - 为什么Gson将整数解析为双精度?

public class Test { 

    @SuppressWarnings("serial") 
    public static void main(String[] args) { 
     Map<String, Object> hashMap = new HashMap<String, Object>(); 
     hashMap.put("data", "{\"rowNum\":0,\"colNum\":2,\"text\":\"math\"}"); 

     Map<String,Object> dataMap = JsonUtil.getGson().fromJson(
       hashMap.get("data").toString(),new TypeToken<Map<String,Object>>() {}.getType()); 

     System.out.println(dataMap.toString()); 

    } 
} 

结果:
控制台打印:{rowNum=0.0, colNum=2.0, text=math}
诠释转化为双;
为什么GSON改变类型,我该如何解决呢?

+0

2是一个数字,双覆盖int值,所以它是一件好事,它这样做。 (如果您将字段看作整数,那么它将不会更新) – nafas

+0

JSON只有一个数字类型,它不会影响double和int值。 –

回答

2

GSON是一个简单的解析器。如果您正在将数据解析到Object,它始终使用Double作为默认数字类型。

检查这个问题的详细资料:How to prevent Gson from expressing integers as floats

我建议你使用Jackson Mapper。杰克逊类型之间进行区分,即使你解析到对象:

  • "2"作为Integer
  • "2.0"Double

下面是一个例子:

Map<String, Object> hashMap = new HashMap<String, Object>(); 
hashMap.put("data", "{\"rowNum\":0,\"colNum\":2,\"text\":\"math\"}"); 
ObjectMapper mapper = new ObjectMapper(); 
TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {}; 

HashMap<String, Object> o = mapper.readValue(hashMap.get("data").toString(), typeRef); 

行家:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.9.0</version> 
</dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.9.0</version> 
</dependency> 
2

JSON使得Java的方式做不同类型的数之间没有区别。它将所有类型的数字视为单一类型。

数字被解析为Double是GSON库的实现细节。遇到JSON号码时,默认将其解析为Double

而不是使用一个Map的,倒不如定义封装JSON结构的各个领域一个POJO。这使得后来访问数据变得更加容易,数字自动被解析为Integer

class Cell { 
    private Integer rowNum; 
    private Integer colNum; 
    private String text; 
} 

public static void main(String[] args) throws Exception { 
    Map<String, Object> hashMap = new HashMap<String, Object>(); 
    hashMap.put("data", "{\"rowNum\":0,\"colNum\":2,\"text\":\"math\"}"); 

    Cell cell = new Gson().fromJson(hashMap.get("data").toString(), Cell.class); 
    System.out.println(cell); 
} 
相关问题