2017-08-17 8 views
3

複雑なjson文字列とマップに変換したい
問題があります。
は、この簡単なテストを見てください:Java - GsonがIntegerをDoubleとして解析するのはなぜですか?

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}
INTがダブルに変換されます。
はなぜタイプを変更gsonず、どのように私はそれを修正することができますか?

+0

2は数字であり、doubleはint値をカバーするので、それはそのことを意味します。 (フィールドを整数として読み取った場合、コンパイルされません) – nafas

+0

JSONには数値型が1つしかありません。double型とint型の値に違いはありません。 –

答えて

2

Gsonは単純なパーサーです。 Objectにデータを解析する場合は、常にDoubleをデフォルトの数値型として使用します。

は、詳細については、この質問をチェックしてください:How to prevent Gson from expressing integers as floats

私はあなたがJackson Mapperを使用することをお勧めします。

  • "2"ここ

Doubleとして

  • "2.0"Integerとされる例:

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

    Mavenを:あなたがオブジェクトに解析している場合でも、ジャクソンは種類を区別

    <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のやり方とは異なる種類の数字を区別しません。それはすべての種類の数字を1つのタイプとみなします。

    数字が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); 
    } 
    
    関連する問題