最近我一直在玩一个Web服务,它返回一个json
对象,比如这个
{
"id": 88319,
"dt": 1345284000,
"name": "Benghazi",
"coord": {
"lat": 32.12,
"lon": 20.07
},
"main": {
"temp": 306.15,
"pressure": 1013,
"humidity": 44
},
"wind": {
"speed": 1,
"deg": -7
},
"clouds": {
"all": 90
},
"rain": {
"3h": 3
}
}
我已经自动生成了映射到json数据的Java类。问题是我无法生成一个名为3h的属性的Java类(在Java中,与许多其他语言一样,变量标识符不能以数字开头)。作为一次破解,我将属性3h重新定义为h3,每当我收到来自web服务的json响应时,我都会将字符串"3h"替换为"h3"。
然而,这种方法只适用于小型项目。我想知道是否有更方便的方法来处理这种情况。
注意:对于这个特定的示例,我使用了一个在线工具,该工具生成了给定json示例的java类。在其他情况下,我使用了Jackson和其他框架。?这个问题的答案取决于框架吗?更具体地说,考虑到未来,我希望遵守json模式规范
如果使用Gson,可以使用@SerializedName
注释。
Java类:
public class JsonData {
@SerializedName("3h")
private int h3;
private String name;
public JsonData(int h3, String name) {
this.h3 = h3;
this.name = name;
}
}
序列化:(同样的类也适用于fromJson())
// prints: {"3h": 3,"name": "Benghazi"}
System.out.println(new Gson().toJson(new JsonData(3, "Benghazi")));
参考:
@SerializedName注释
以下是您要查找的内容。虽然看起来很简单,但我花了一段时间才掌握正确的语法。
public class Rain {
@JsonProperty("3h")
public BigDecimal detail = BigDecimal.valueOf(0);
}
您可能不需要它,但我将默认值设置为0。"3h"是密钥的名称。"detail"是我赋予该属性的名称,用于保存WAS用"3h"表示的值。
您可以为正在生成的属性的数据类型加前缀。就像各个对象的arr_、int_、obj_等一样,因为在自动生成过程中,无论如何都必须处理数据类型。这将成为一个通用的修复程序,而不是专门寻找像"3h"这样的字符串。但从设计或良好实践的角度来看,这可能不是最理想的解决方案。
"我想知道是否有更方便的方法来处理这种情况。"
首先,我不知道"这种情况"是什么,因为你没有提到你进行映射的框架或方法。
如果你想让属性标识符映射到你的json键,从数字开始,这是不可能的,这也是好的。
因为,比如说,如果你的最后一个子文档:
"rain": {
"3h": 3
}
被映射到Rain类为:
class Rain{
int 3h=3
}
那么你将如何解析变量赋值"3h=3"呢?(参考本SO帖子)
所以我能想到的一种方法是,也许你可以在任何以数字开头的键前面加上特殊的合法标识符字符(如"_"下划线),然后删除赋值。
也就是说,您可以将json子文档rain映射为:
class Rain{
int _3h=3
}
稍后在反序列化时删除前导下划线。
希望能有所帮助!!!