8

私のクラス:

class ExampleBean {
   private String _firstField;
   private String _secondField;
   // respective getters and setters
}

私は次のように表示したい:

{
     "FirstField":"value",
     "SecondField":"value"
}

そして、このようではありません

{
     "_FirstField":"value",
     "_SecondField":"value"
}

次のようにパーサーを初期化します。

GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat(DateFormat.LONG);
    builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
    builder.setPrettyPrinting();
    set_defaultParser(builder.create());

APIと「FieldNamePolicy」のドキュメントを確認できましたが、「_」をスキップするオプションがないことに驚いています。また、注釈を使用できることも知っています...

@ SerializedName (" custom_naming ")

...しかし、すべてのフィールドにこれを書き込む必要はありません...

ローカル変数とクラスのフィールドを区別することは、私にとって非常に便利です。:( 何か案が?

編集:多くの明白な解決策があります (継承、gson 上書きメソッド、正規表現)。私の質問は、gson のネイティブ ソリューションがあるのか​​、それともそれほど邪魔にならない修正があるのか​​という点に重点を置いていますか?

たぶん、新しい FieldNamePolicy として提案できますか?

4

2 に答える 2

14

GsonBuilder独自の実装setFieldNamingStrategy()を渡すことができるメソッドを提供します。FieldNamingStrategy

これはへの呼び出しを置き換えることに注意してくださいsetFieldNamingPolicy()- これらの2つのメソッドのソースを見ると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;
    }
}

出力:

{
  "FirstField": "first field value",
  "SecondField": "second field value"
}
于 2013-02-20T19:17:38.283 に答える