繁体   English   中英

当一些变量名以数字开头时,如何将Json映射到Java类?

[英]How to map Json to Java classes when some variable names begin with a number?

最近我一直在玩一个返回像这样的json对象的web服务

{
  "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规范

如果使用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

您可以为要生成的属性的数据类型添加前缀。 与各个对象的arr_,int_,obj_等一样,因为在自动生成期间,无论如何都要处理数据类型。 这将成为一般修复,而不是专门寻找像“3h”这样的字符串。 但在设计方面或良好实践方面,这可能不是最佳解决方案。

“我想知道是否有更方便的方法来处理这种情况。”

首先,我无法弄清楚“这种情况”是什么,因为你没有提到你进行映射的框架或方法。

如果你想让属性标识符映射到你的json键,从数字开始,这是不可能的,这也只是好的。

因为,例如,如果您的最后一个子文档:

"rain": {
    "3h": 3
  }

被映射到类Rain:

class Rain{
   int 3h=3
}

那么你将如何解析变量赋值“3h = 3”?(请参阅 SO帖子)

所以我能想到的一种方法是,你可以为任何键添加前缀,这些键以带有特殊法律标识符charatcers(如“_”下划线)的数字开头,然后删除赋值。

这意味着,您可以将您的json子文档映射映射为:

class Rain{
   int _3h=3
}

然后在反序列化时删除前导下划线。

希望有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM