Answers:
我发现以下设置在读取带有下划线属性的json并在模型中使用驼峰包装时非常有效。
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
您可以使用SerializedName
注释:
@SerializedName("field_name_in_json")
private final String fieldNameInJava;
注意:已经设置了时FieldNamingPolicy
,SerializedName
将覆盖该特定字段的设置(在特殊情况下非常方便)。
请记住,您的示例是一个极端案例。如果您有一个属性'foo',它的getter应该被命名为'getFoo',如果您有一个名为'foo_bar'的属性,它的getter应该被命名为'getFooBar',但是,在您的示例中,您映射的是布尔值,布尔值具有Java中的特殊情况命名约定。名为online的原始布尔属性应具有名为“ isOnline”的吸气剂,而不是“ getOnline”或更糟的“ getIsOnline”。布尔包装对象(即布尔值)不应遵循这种特殊情况,并且名为“ online”的属性应具有名为“ getOnline”的吸气剂。
因此,名称中带有'is'的布尔属性是一个极端的情况,在这种情况下,您需要在转换过程中去除该特定前缀。相反,您的代码可能想要检查json对象的原始属性名称和'is_XXX'版本。
我想你想要的是这里。使用批注,您可以告诉GSON mySuperCoolField在JSON中实际上称为this_field_is_fun,它将正确解压。至少我认为它也可以反序列化。
如果那不起作用,则可以使用自定义的JsonSerializer / JsonDeserializers,该方法效果很好,但是您必须为它们在类中的更改而更新它们(例如,添加字段时)。您会失去自动魔法。
最简单的操作(这很丑陋,但是如果第一个建议不起作用,则非常干净和简单)是简单地命名字段,以使GSON满意,并使用您喜欢的名称添加额外的访问器方法,例如
public boolean isXXX() {return this.is_XXX;}