如何防止Gson序列化/反序列化字段的第一个字符(下划线)?

ena*_*gra 6 parsing json gson

我的课:

class ExampleBean {
   private String _firstField;
   private String _secondField;
   // respective getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我希望看起来如下:

{
     "FirstField":"value",
     "SecondField":"value"
}
Run Code Online (Sandbox Code Playgroud)

而不是这样

{
     "_FirstField":"value",
     "_SecondField":"value"
}
Run Code Online (Sandbox Code Playgroud)

我按如下方式初始化解析器:

GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat(DateFormat.LONG);
    builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
    builder.setPrettyPrinting();
    set_defaultParser(builder.create());
Run Code Online (Sandbox Code Playgroud)

我可以看到API和"FieldNamePolicy" 的文档,但我很惊讶,不提供跳过"_"的选项我也知道我可以使用注释...

@ SerializedName (" custom_naming ")
Run Code Online (Sandbox Code Playgroud)

...但是我不想为alllllll我的领域写这个......

对我来说区分局部变量和类的字段非常有用.:( 任何的想法?

编辑:会有很多明显的解决方案,(继承,gson覆盖方法,常规表达).我的问题更侧重于是否存在gson的原生解决方案或更少侵入性的修复?

也许我们可以建议新的FieldNamePolicy?

Bri*_*ach 13

GsonBuilder提供了一种setFieldNamingStrategy()允许您传递自己的FieldNamingStrategy实现的方法.

请注意,这会将调用替换为setFieldNamingPolicy()- 如果您查看GsonBuilder这两个方法的源是互斥的,因为它们设置了相同的内部字段(FieldNamingPolicy枚举是a FieldNamingStrategy).

public class App
{
    public static void main(String[] args)
    {
        Gson gson = new GsonBuilder()
                        .setFieldNamingStrategy(new MyFieldNamingStrategy())
                        .setPrettyPrinting()
                        .create();

        System.out.println(gson.toJson(new ExampleBean()));
    }
}

class ExampleBean
{

    private String _firstField = "first field value";
    private String _secondField = "second field value";
    // respective getters and setters
}

class MyFieldNamingStrategy implements FieldNamingStrategy
{
    public String translateName(Field field)
    {
        String fieldName = 
            FieldNamingPolicy.UPPER_CAMEL_CASE.translateName(field);
        if (fieldName.startsWith("_"))
        {
            fieldName = fieldName.substring(1);
        }
        return fieldName;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "FirstField": "first field value",
  "SecondField": "second field value"
}
Run Code Online (Sandbox Code Playgroud)