2013-02-19 2 views
5

私のクラス:Gsonがフィールドの先頭文字(アンダースコア)をシリアル化/逆シリアル化するのを防ぐには?

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()); 

...私はまた、私はアノテーションを使用することができます知っている

@ SerializedName (" custom_naming ") 

を私はAPIと「FieldNamePolicy」のdocumentation中を見ることができましたが、私はスキップするオプションを与えていないことを驚いて「_」...私のフィールドalllllllのためにこれを書く必要はありません...

私は、ローカル変数とクラスのフィールドを区別することは非常に便利です。 :(任意のアイデア

EDIT:?(上書き方法gson継承、定期expresions)、多くの明白な解決策があるでしょう私の質問はgsonのネイティブ溶液または控えめ修正があるかどうかに重点を置いています。 ?

多分、我々は新しいFieldNamePolicyとして提案することができる?

+0

を生成

import java.lang.reflect.Field; import java.text.DateFormat; import com.google.gson.FieldNamingStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class GsonExample { public static void main(String... args) throws Exception { final GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(DateFormat.LONG); builder.setPrettyPrinting(); builder.setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field f) { String fieldName = f.getName(); if(fieldName.startsWith("_") && fieldName.length() > 1) { fieldName = fieldName.substring(1, 2).toUpperCase() + fieldName.substring(2); } return fieldName; } }); final Gson gson = builder.create(); System.out.println(gson.toJson(new ExampleBean("example", "bean"))); } private static class ExampleBean { private final String _firstField; private final String _secondField; private ExampleBean(String _firstField, String _secondField) { this._firstField = _firstField; this._secondField = _secondField; } } } 

ですアンダースコアを使用します。 JSONの命名規則では許可されていますが、JSONでPascalCaseを使用している人はほとんど見つかりません(これがあなたの提案する出力です)。あなたの他のオプションは、一致しないすべてのフィールド名に '@ SerializedName'を使用しています。 –

+0

私は知らないことは教えてくれませんでした。私と私の専門家のチームは、我々がもっと同意する言語規則を自由に選ぶことができます。特に、さまざまなテクノロジと言語を同時に統合する場合。とにかく、ありがとうございました。 – enagra

+0

あなたとあなたの "専門家のチーム"は、そこから生じる問題に対処する用意があるべきですか?奇妙なことに、私は実際にコメントしたときにリフレクションを使用してカスタムGson JsonSerializerでこれを実際に達成する方法を示す回答を入力していました。しかし、私はあなたが専門家のチーム全体を持っていることを考えると、あなたがそれを理解すると確信しています... –

答えて

11

GsonBuilderは、あなた自身のFieldNamingStrategyの実装を渡すことができます方法setFieldNamingStrategy()を提供。

注これは、CALを置き換えることl〜setFieldNamingPolicy() - GsonBuilderのソースを見ると、これらの2つの方法は同じ内部フィールドを設定するため、相互に排他的です(FieldNamingPolicy列挙型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" 
} 
+0

ありがとうブライアン!これは本当に素晴らしい解決策です! – enagra

+0

これを編集してコンパイルして動作させましたが、編集は拒否されました。 FieldNamingPolicyにtranslateName()メソッドはありません。 http://stackoverflow.com/review/suggested-edits/5997458 – Kirby

+0

@Kirbyバージョン1.3以降https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/ gson/FieldNamingStrategy.html – Justin

0

あなたが欲しい何が適切なJavaの命名規則に従っていない...答えは

{"FirstField":"example","SecondField":"bean"} 
関連する問題