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


106

我正在使用GSON将获取的JSON数据转换为Java对象。在我所有的测试中,它都运行良好。问题在于我们的真实对象具有一些名为is_online的属性。GSON仅在名称完全相等时才映射它们,最好将GSON将名称转换为Java驼峰,例如isOnline。

在创建JSON数据时,这似乎是可能的,驼峰式大小写将转换为JSON中下划线分隔的单词。但是我找不到另一种方法来指定此方法。


5
我建议接受一个答案
JeanValjean '16

Answers:


313

我发现以下设置在读取带有下划线属性的json并在模型中使用驼峰包装时非常有效。

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

2
好答案,谢谢!@janusz,如果这些答案中的任何一个对您有所帮助,请将其标记为“接受的答案”。
sufinawaz 2014年

1
如果您的名字包含两个下划线,那么它将忽略第一个下划线。例如 this_key_has__two_underscores将转换为thisKeyHas_TwoUnderscores,反之亦然。关键点是FieldNamingPolicy,其中枚举用下划线表示“小写”,而此处转换后的名称用下划线(_T)表示大写。
Deepak GM

非常简单,使我不必注释一堆字段!
William T. Mallard

98

您可以使用SerializedName注释:

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

注意:已经设置了时FieldNamingPolicySerializedName将覆盖该特定字段的设置(在特殊情况下非常方便)。


2

请记住,您的示例是一个极端案例。如果您有一个属性'foo',它的getter应该被命名为'getFoo',如果您有一个名为'foo_bar'的属性,它的getter应该被命名为'getFooBar',但是,在您的示例中,您映射的是布尔值,布尔值具有Java中的特殊情况命名约定。名为online的原始布尔属性应具有名为“ isOnline”的吸气剂,而不是“ getOnline”或更糟的“ getIsOnline”。布尔包装对象(即布尔值)不应遵循这种特殊情况,并且名为“ online”的属性应具有名为“ getOnline”的吸气剂。

因此,名称中带有'is'的布尔属性是一个极端的情况,在这种情况下,您需要在转换过程中去除该特定前缀。相反,您的代码可能想要检查json对象的原始属性名称和'is_XXX'版本。


2

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

如果那不起作用,则可以使用自定义的JsonSerializer / JsonDeserializers,该方法效果很好,但是您必须为它们在类中的更改而更新它们(例如,添加字段时)。您会失去自动魔法。

最简单的操作(这很丑陋,但是如果第一个建议不起作用,则非常干净和简单)是简单地命名字段,以使GSON满意,并使用您喜欢的名称添加额外的访问器方法,例如

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

最简单的事情是我目前正在做什么,并且效果很好。所有丑陋的,不典型的Java样式的代码都隐藏在数据类中,并且没有人从外面看到它。但这仍然让我有点::)
Janusz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.