5

最近我一直在玩一个返回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 规范

4

4 回答 4

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注解

于 2013-07-12T08:16:55.380 回答
0

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

于 2013-07-12T08:09:40.757 回答
0

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

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

如果你想让属性标识符映射到你的 json 键,以数字开头,这是不可能的,这也是唯一的。

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

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

映射到类 Rain 为:

class Rain{
   int 3h=3
}

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

所以我能想到的一种方法是,也许你可以为任何以数字开头的键加上特殊的合法标识符字符(如“_”下划线),然后再删除分配。

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

class Rain{
   int _3h=3
}

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

希望有帮助!!!

于 2013-07-12T08:29:27.970 回答
0

这就是你要找的东西。看起来很简单,正确的语法花了我一段时间。

public class Rain {
    @JsonProperty("3h")
    public BigDecimal detail = BigDecimal.valueOf(0);
}

您可能不需要它,但我将默认设置为 0。“3h”是密钥的名称。“detail”是我给属性命名的名称,用来保存 WAS 由“3h”表示的值。

于 2019-09-16T02:22:50.407 回答