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

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

看来这是可能的,同时创buildJSON数据,骆驼大小写转换为JSON中的下划线分隔的单词。 但我找不到一种方法来反过来指定这个。

我发现阅读具有下划线属性的json和在我的模型中使用camelcasing时,下面的设置是完美的。

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

您可以使用SerializedName批注:

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

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

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

因此,在名称中带有“is”的布尔属性是一个边缘情况,在转换过程中,您将要删除此特定前缀。 在相反的方向上,你的代码可能需要检查json对象的原始属性名称以及'is_XXX'版本。

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

如果这不起作用,你可以使用自定义的JsonSerializer / JsonDeserializers,这很好用,但是你必须更新它们以获得类中的改变(比如添加一个字段)。 你失去了自动魔法。

最容易做的事情(如果第一个build议不起作用,这将是丑陋的,但非常干净和简单)将只是简单地命名该字段,使GSON感到高兴,并添加额外的访问器方法与您喜欢的名称,例如

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