我正在使用GSON将JSON数据转换为Java对象。它在我的所有测试中都运行良好。 问题是我们的真实对象有一些名为is_online的属性。 GSON只有在命名完全相同的情况下才会映射它们,将GSON转换为Java驼峰情况isOnline会很好。
在创建JSON数据时似乎可以实现这一点,驼峰案例在JSON中转换为下划线分隔的单词。但我无法找到另一种方法来指明这一点。
答案 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;}