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

Jan*_*usz 94 java json camelcasing gson

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

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

Ham*_*pei 290

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

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,谢谢!@janusz,如果这些答案中的任何一个对您有帮助,请将它们标记为已接受的答案. (2认同)

sas*_*oar 90

您可以使用SerializedName注释:

@SerializedName("field_name_in_json")
private final String fieldNameInJava;
Run Code Online (Sandbox Code Playgroud)

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


Jhe*_*ico 2

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

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