我想将下划线字段(例如this_field_to_mapped
)映射到camelcase(thisFieldToMapped
)。
因此,我使用Gson
创建了GsonBuilder
个对象,并对已实施FieldNamingStrategy
和SomeClass
的新类进行了编码。
我会从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);
}
}
答案 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
作为策略。