如何反序列化以整数为键的 JSON?

How to deserialize a JSON with integer as key?

我有一个 JSON 看起来像这样:

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

这个 JSON 实际上是一个更大的 JSON 文件的一部分,我只提取了我难以反序列化的部分。我需要将其反序列化为 Java 对象。我尝试使用以下 class 执行此操作,但它为我提供了所有键的 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:

我用来反序列化的代码如下,其中我将 class 作为 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);
        }
    }
}

你可以利用 Jackson JSON API。

http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

您试图通过使用 Jackson 注释(另一个不同的 JSON 映射器)对其 class 进行注释来影响 Gson(JSON 映射器)反序列化对象的方式。

这不可能。 Gson 不关心 Jackson 注释。

如果您希望考虑这些注释,请使用 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);