web-dev-qa-db-ja.com

JSONへのオブジェクトシリアル化(Gsonを使用)。 UpperCamelCaseでフィールド名を設定する方法は?

Google Gsonライブラリを使用して、単純なJavaオブジェクトのリストをJSONにシリアル化する必要があります。

オブジェクト:

public class SimpleNode {
    private String imageIndex;
    private String text;

    public String getImageIndex() {
        return imageIndex;
    }

    public void setImageIndex(String imageIndex) {
        this.imageIndex = imageIndex;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
       this.text = text;
    }
}

シリアル化のために次のコードを作成しました。

 List<SimpleNode> testNodes = repository.getElements(0);
 Gson gson = new Gson();
 String jsonNodesAsString = gson.toJson(testNodes);

動作しますが、JSONオブジェクトのフィールド名はlowerCamelCaseです。このような:

[
  {
    "imageIndex": "1",
    "text": "Text 1"
  },
  {
    "imageIndex": "2",
    "text": "Text 2"
  }
]

次のように、UpperCamelCaseフィールド名でJSONを取得するにはどうすればよいですか:

[
  {
    "ImageIndex": "1",
    "Text": "Text 1"
  },
  {
    "ImageIndex": "2",
    "Text": "Text 2"
  }
]

メンバー変数の名前をUpperCamelCaseに変更できると思いますが、別の方法がありますか?

27
Frank59

ドキュメントから取られた:

Gsonは、標準のJavaフィールド名(小文字で始まるキャメルケース名--- "sampleFieldNameInJava")をJsonフィールド名(sample_field_name_in_JavaまたはSampleFieldNameInJava)。定義済みの命名ポリシーについては、FieldNamingPolicyクラスを参照してください。

また、クライアントがフィールドごとにカスタム名を定義できるようにする注釈ベースの戦略もあります。注釈ベースの戦略には、無効なフィールド名が注釈値として提供された場合に「ランタイム」例外を発生させるフィールド名検証があります。

以下は、Gson命名ポリシー機能の両方を使用する方法の例です。

private class SomeObject {
  @SerializedName("custom_naming") 
  private final String someField;

  private final String someOtherField;

  public SomeObject(String a, String b) {
    this.someField = a;
    this.someOtherField = b;
  }
}

SomeObject someObject = new SomeObject("first", "second");
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
String jsonRepresentation = gson.toJson(someObject);
System.out.println(jsonRepresentation);

========出力=========

{"custom_naming":"first","SomeOtherField":"second"}

しかし、あなたが望むもののために、あなたはこれを使うことができます:

Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();

UPPER_CAMEL_CASEオプションを使用すると、目標を達成できます。

51
Benjamin Dale