使用GSON将JSON样式属性名称转换为Java CamelCase名称

时间:2010-03-03 11:28:46

标签: java json gson camelcasing

我正在使用GSON将JSON数据转换为Java对象。它在我的所有测试中都运行良好。 问题是我们的真实对象有一些名为is_online的属性。 GSON只有在命名完全相同的情况下才会映射它们,将GSON转换为Java驼峰情况isOnline会很好。

在创建JSON数据时似乎可以实现这一点,驼峰案例在JSON中转换为下划线分隔的单词。但我无法找到另一种方法来指明这一点。

4 个答案:

答案 0 :(得分:269)

我发现以下设置在使用下划线属性读取json并在模型中使用camelcasing时非常有用。

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

答案 1 :(得分:81)

您可以使用SerializedName注释:

@SerializedName("field_name_in_json")
private final String fieldNameInJava;

注意:当您已设置FieldNamingPolicy时,SerializedName将覆盖该特定字段的设置(对于特殊情况非常方便)。

答案 2 :(得分:2)

请记住,您的示例是边缘情况。如果你有一个属性'foo',它的getter应命名为'getFoo',如果你有一个名为'foo_bar'的属性,它的getter应命名为'getFooBar',但是,在你的例子中你要映射一个布尔值和布尔值java中的特殊情况命名约定。名为online的原始布尔属性应该有一个名为'isOnline'的getter,而不是'getOnline',或者更糟糕的是'getIsOnline'。布尔包装器对象(即布尔值)不应该遵循这种特殊情况,名为“online”的属性应该有一个名为“getOnline”的getter。

因此,名称中带有'is'的布尔属性是边缘情况,您需要在转换期间去除此特定前缀。在相反的方向上,您的代码可能希望检查json对象的原始属性名称以及'is_XXX'版本。

答案 3 :(得分:2)

我认为你想要的是here。使用注释,您可以告诉GSON mySuperCoolField实际上是在JSON中调用this_field_is_fun,它将正确解压缩它。至少我认为它也适用于反序列化。

如果这不起作用,您可以使用自定义JsonSerializer / JsonDeserializers,它们可以很好地工作,但您必须更新它们以适应类中的更改(例如添加字段时)。你失去了自动魔法。

最容易做的事情(如果第一个建议不起作用,那将是丑陋的,但非常干净和简单)将简单地命名字段以使GSON满意,并添加额外的存取方法你喜欢的名字,例如

public boolean isXXX() {return this.is_XXX;}