最近,我一直在玩一个返回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-schema规范
答案 0 :(得分:4)
如果使用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 Annotation
答案 1 :(得分:0)
您可以为正在生成的属性的数据类型添加前缀。与各个对象的arr_,int_,obj_等一样,因为在自动生成期间,无论如何都要处理数据类型。这将成为一般修复,而不是专门寻找像“3h”这样的字符串。但在设计方面或良好实践方面,这可能不是最佳解决方案。
答案 2 :(得分:0)
“我想知道是否有更方便的方法来应对这种情况。”
首先,我无法弄清楚“这种情况”是什么,因为你没有提到用于制作映射的框架或方法。
如果你想让属性标识符映射到你的json键,从数字开始,这是不可能的,这也只是好的。
因为,例如,如果你的最后一个子文档:
"rain": {
"3h": 3
}
映射到类Rain:
class Rain{
int 3h=3
}
那么你将如何解析变量赋值“3h = 3”?(参考this SO post)
所以我能想到的方法是,你可以在任何键前加上带有特殊法定标识符charatcers(如“_”下划线)的数字,然后删除赋值。
这意味着,您可以将您的json子文档映射为:
class Rain{
int _3h=3
}
然后在反序列化时删除前导下划线。
希望有所帮助!!!
答案 3 :(得分:0)
这是您要寻找的。看起来很简单,正确使用语法花了我一段时间。
public class Rain {
@JsonProperty("3h")
public BigDecimal detail = BigDecimal.valueOf(0);
}
您可能不需要它,但是我将默认值设置为0。 “ 3h”是密钥的名称。 “ detail”是我为属性赋予的名称,用来保存WAS以“ 3h”表示的值。