123

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

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

4

4 回答 4

347

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

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()
于 2012-08-04T16:26:48.787 回答
110

您可以使用SerializedName注释:

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

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

于 2013-10-21T10:23:40.080 回答
2

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

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

于 2010-09-09T13:37:25.617 回答
2

我想你想要的就在这里。使用注释可以告诉 GSON mySuperCoolField 在 JSON 中实际上被称为 this_field_is_fun 并且它会正确解包它。至少我认为它也适用于反序列化。

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

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

public boolean isXXX() {return this.is_XXX;}
于 2010-09-09T13:46:11.827 回答