【问题标题】:Convert JSON style properties names to Java CamelCase names with GSON使用 GSON 将 JSON 样式属性名称转换为 Java CamelCase 名称
【发布时间】:2011-01-23 04:00:07
【问题描述】:

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

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

【问题讨论】:

  • 我建议接受答案

标签: java json gson camelcasing


【解决方案1】:

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

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

【讨论】:

  • 很好的答案,谢谢! @janusz,如果这些答案中的任何一个对您有所帮助,请将它们标记为已接受的答案。
  • 如果名称包含两个下划线,则忽略第一个下划线。前任。 this_key_has__two_underscores 将转换为 thisKeyHas_TwoUnderscores,反之亦然。关键点是 FieldNamingPolicy,其中枚举用下划线表示“小写”,而这里转换后的名称有一个带下划线 (_T) 的大写。
  • 很简单,让我不用注释一堆字段!
【解决方案2】:

你可以使用SerializedName注解:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 简单的事情就是我现在正在做的事情,它工作得很好。所有丑陋的非典型 java 风格的代码都隐藏在数据类中,外部没有人会看到它。但它仍然让我有点唠叨:)
      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 2020-01-25
      • 2023-02-10
      • 2020-09-01
      • 2020-02-02
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多