web-dev-qa-db-fra.com

Sérialisation d'objets en JSON (en utilisant Gson). Comment définir les noms de champ dans UpperCamelCase?

J'ai besoin de sérialiser une liste d'objets simples Java en JSON à l'aide de la bibliothèque Google Gson.

L'object:

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;
    }
}

J'ai écrit le code suivant pour la sérialisation:

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

Cela fonctionne, mais le nom de champ des objets JSON est lowerCamelCase. Comme ça:

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

Comment obtenir un JSON avec un nom de champ UpperCamelCase, comme ceci:

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

Je pense que je peux renommer les variables membres en UpperCamelCase, mais peut-être y a-t-il une autre façon?

27
Frank59

Tiré des documents:

Gson prend en charge certaines politiques de dénomination de champ prédéfinies pour convertir les noms de champ standard Java (c.-à-d. Les noms de chameau commençant par des minuscules --- "sampleFieldNameInJava") en nom de champ Json (c.-à-d. Sample_field_name_in_Java ou SampleFieldNameInJava). Consultez la classe FieldNamingPolicy pour plus d'informations sur les stratégies de dénomination prédéfinies.

Il a également une stratégie basée sur des annotations pour permettre aux clients de définir des noms personnalisés sur une base par champ. Notez que la stratégie basée sur les annotations a une validation de nom de champ qui déclenchera des exceptions "Runtime" si un nom de champ non valide est fourni comme valeur d'annotation.

Voici un exemple d'utilisation des deux fonctionnalités de stratégie de nommage 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);

======== SORTIE ========

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

Cependant, pour ce que vous voulez, vous pouvez simplement utiliser ceci:

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

En utilisant l'option UPPER_CAMEL_CASE, vous atteindrez votre objectif.

51
Benjamin Dale