Gson FieldNamingStrategy有多个策略

时间:2016-07-26 00:36:56

标签: java gson

我想将下划线字段(例如this_field_to_mapped)映射到camelcase(thisFieldToMapped)。

因此,我使用Gson创建了GsonBuilder个对象,并对已实施FieldNamingStrategySomeClass的新类进行了编码。

我会从Gson.fromJson运行{"thisItem" : "hello", "this_field_to_mapped":1},但是控制台日志已经打印出来了。

  

替换:thisItem
  替换:thisFieldToMapped
  你好
  0

thisItem映射得很好,但thisFieldToMapped打印了0。

如何将下划线字段映射到camelcase?

这是我的代码。

  

SomeClass的

public static class SomeClass {
    public String thisItem;
    public int thisFieldToMapped;
}
  

UnderScoreToUpper

public static class UnderScoreToUpper implements FieldNamingStrategy {

    public String translateName(Field f) {
        String name = f.getName();

        Pattern p = Pattern.compile("[_][a-z]{1}");

        Matcher m = p.matcher(name);

        while (m.find()) {
            System.out.println("matched : " + m.group(0));
            String c = m.group(0).replace("_", "").toUpperCase();
            name = name.replace(m.group(0), c);
        }

        System.out.println("replaced : " + name);

        return name;
    }

}

这是主要方法

public static void main(String[] args) {

    String gsonString = "{\"thisItem\" : \"hello\", \"this_field_to_mapped\":1}";

    Gson g = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss")
            .setFieldNamingStrategy(new UnderScoreToUpper())
            .serializeSpecialFloatingPointValues().setPrettyPrinting()
            .serializeNulls().create();

    SomeClass c = g.fromJson(gsonString, SomeClass.class);

    if (c != null) {
        System.out.println(c.thisItem);
        System.out.println(c.thisFieldToMapped);
    }
}

1 个答案:

答案 0 :(得分:1)

你正在倒退。 FieldNamingStrategy个州的javadoc

  

在Gson中提供自定义字段命名的机制。这允许   客户端代码将字段名称转换为特定的约定   不支持作为普通的Java字段声明规则。

此外,FieldNamingStrategy#translateName(String)状态的javadoc

  

将字段名称转换为其JSON字段名称表示。

正如您所知,您作为translateName的参数收到的是Field本身。 translateName用于将该字段的名称转换为将出现在JSON中的名称。

因此,您需要将thisFieldToMapped转换为this_field_to_mapped。你试图反其道而行之。

如果您的所有JSON成员都使用下划线命名,则可以使用FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES作为策略。