2017-08-17 93 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); 
} 
相關問題