如何反序列化以整数为键的 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);
我有一个 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);