首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多策略的Gson FieldNamingStrategy

问具有多策略的Gson FieldNamingStrategy
EN

Stack Overflow用户
提问于 2016-07-26 00:36:56
回答 1查看 1.8K关注 0票数 2

我想把强调字段(如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

代码语言:javascript
复制
public static class SomeClass {
    public String thisItem;
    public int thisFieldToMapped;
}

UnderScoreToUpper

代码语言:javascript
复制
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;
    }

}

这是主要的方法

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-26 00:42:25

你倒着干。用于FieldNamingStrategy状态的javadoc

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

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

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

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

所以您需要将thisFieldToMapped转换为this_field_to_mapped。你正试图做相反的事。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38579412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档