2015-08-22 40 views
0

我有一個JSON它看起來像這樣:如何使用整數作爲關鍵字反序列化JSON?

{ 
"MeterRates": { 
       "0": 0.142, 
       "1024": 0.142, 
       "51200": 0.142, 
       "512000": 0.142, 
       "1024000": 0.1278, 
       "5120000": 0.1051 
      } 
} 

這JSON實際上是一個較大的JSON文件的一部分,我只提取我有困難反序列化的一部分。我需要將它反序列化爲一個Java對象。我嘗試使用以下類來完成此操作,但它爲我提供了所有鍵的值null

public class MeterRates { 
private Double rate0; 
private Double rate1024; 
private Double rate51200; 
private Double rate512000; 
private Double rate1024000; 
private Double rate5120000; 

@JsonProperty("0") 
public Double getRate0() { 
    return rate0; 
} 

public void setRate0(Double rate0) { 
    this.rate0 = rate0; 
} 

@JsonProperty("1024") 
public Double getRate1024() { 
    return rate1024; 
} 

public void setRate1024(Double rate1024) { 
    this.rate1024 = rate1024; 
} 

@JsonProperty("51200") 
public Double getRate51200() { 
    return rate51200; 
} 

public void setRate51200(Double rate51200) { 
    this.rate51200 = rate51200; 
} 

@JsonProperty("512000") 
public Double getRate512000() { 
    return rate512000; 
} 

public void setRate512000(Double rate512000) { 
    this.rate512000 = rate512000; 
} 

@JsonProperty("1024000") 
public Double getRate1024000() { 
    return rate1024000; 
} 

public void setRate1024000(Double rate1024000) { 
    this.rate1024000 = rate1024000; 
} 

@JsonProperty("5120000") 
public Double getRate5120000() { 
    return rate5120000; 
} 

public void setRate5120000(Double rate5120000) { 
    this.rate5120000 = rate5120000; 
} 

@Override 
public String toString() { 
    return "MeterRates [0 = " + rate0 + " 1024 = " + rate1024 + " 51200 = " + rate51200 + " 512000 = " + rate512000 + " 1024000 = " + rate1024000 
      + " 5120000 = " + rate5120000 + "]"; 
} 

}

我試過指this question這也有類似的要求,但不能完全得到如何做到這一點。

更新1:

我使用反序列化的代碼如下,其中我傳遞班級爲MeterRates.class

public static <T> T unmarshalJSON(HttpEntity entity, Class<T> clazz) { 
    InputStream is = null; 

    try { 
     return new Gson().fromJson(EntityUtils.toString(entity), clazz); 
    } catch (ParseException e) { 
     throw new RuntimeException(e); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } finally { 
     try { 
      if (null != is) { 
       is.close(); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
+0

發佈您的代碼。並尊重Java命名約定:變量以小寫字母開頭。 –

+0

另外,爲什麼使用String,因爲值是數字?爲什麼不使用Double來代替? –

+0

@JBNizet:對不起,變量名稱goof-up,改變了,並添加了我用來反序列化的代碼。 – jobin

回答

1

你試圖影響GSON(一個JSON映射器)如何通過與傑克遜註釋(另一種,不同的JSON映射器)註釋它的類反序列化對象。

這不可能工作。 Gson不關心傑克遜註釋。

如果要將這些註釋考慮在內,請使用Jackson將您的JSON反序列化。下面是一個使用Jackson對一個對象進行序列化和反序列化的完整示例(我將字段類型更改爲Double,因爲它們應該是):

MeterRates rates = new MeterRates(); 
    rates.setRate1024(0.7654); 
    rates.setRate51200(0.4567); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    String s = objectMapper.writeValueAsString(rates); 
    System.out.println("s = " + s); 
    MeterRates m = objectMapper.readValue(s, MeterRates.class); 
    System.out.println("m = " + m); 
+0

我正在使用Gson反序列化完整的JSON結構,是否可以調整解決方案來使用Gson而不是? – jobin

+0

我不習慣Gson,但它有一個很好的文檔。閱讀。 2分鐘瀏覽用戶指南的目錄就足以找到這個:https://sites.google.com/site/gson/gson-user-guide#TOC-JSON-Field-Naming-Support –

+0

我刪除了傑克遜帶有GSON註釋的註釋('@ SerializedName'),現在可以使用。謝謝! – jobin

相關問題