2017-08-10 3 views
0

Ich versuche, ein JSON mit allen Feldern in Kleinbuchstaben zu deserialisieren. Das Problem ist: mein POJO-Objekt hat Attribute, die als camelcase gesetzt sind, und wenn ich versuche, mit gson.fromJson zu deserialisieren, werden meine camelcase-Attribute nicht gesetzt.Gson deserialize Kleinbuchstaben JSON Camelcase Klassenobjekt

Beispiel JSON:

[ 
    { 
     "idpojo": 1, 
     "namepojo": "test" 
    } 
] 

POJO Klasse:

public class Pojo { 

    private Integer idPojo; 
    private String namePojo; 

    //constructors, getters and setters 

} 

Deserialisierung Code:

List<T> objects = new ArrayList<>(); 
// At this point I only have an variable with a reference to a classe. Let's assume it is in fact a reference to Pojo class 
Class VARIABLE_WITH_REFERENCE_TO_A_CLASS = Pojo.class; 
Class pojoReference = VARIABLE_WITH_REFERENCE_TO_A_CLASS; 
String json = EXAMPLE_JSON_HERE; 
JSONArray jsonArray = new JSONArray(json); 
int len = jsonArray.length(); 
for (int i = 0; i < len; i++) { 
    objects.add((T) new Gson().fromJson(jsonArray.get(i).toString(), pojoReference))); 
} 

Der Grund, warum ich bin Deserialisieren die JSON zu einer Liste von einer generischen Klasse statt Eine Liste von Pojo-Klassen ist, weil ich an diesem Punkt meines Codes nicht weiß, welche Klasse ich meinen Col erstellen soll Lektion.

Dieser Code funktioniert einwandfrei. Das Problem ist: Die Camelcase-Attribute aus der Pojo-Klasse werden nach der Deserialisierung nicht gesetzt.

Was ich bis jetzt versucht habe, ist die Annotation @SerializedName auf den Feldern, und auch das Erstellen von benutzerdefinierten Deserializern, aber nicht den Trick für mich, weil ich wirklich keinen Code für Deserialisierung von schreiben will/kann Objekte.

Frage:

Verwendung generisch, wie kann ich ein JSON-Objekt mit Klein atributes zu einer Java-Klasse (wie Pojo.class) mit Camelcase Attributen deserialisieren?

Antwort

0

Das Problem mit Jackson statt Gson für Deserialisierung gelöst.

Jackson muss Version 2.5 oder höher sein, auch muss man den Mapper so konfigurieren, dass er case-insensitive Attribute akzeptiert.

Neue Arbeitscode:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

List<T> objects = new ArrayList<>(); 
// At this point I only have an variable with a reference to a classe. Let's assume it is in fact a reference to Pojo class 
Class VARIABLE_WITH_REFERENCE_TO_A_CLASS = Pojo.class; 
Class pojoReference = VARIABLE_WITH_REFERENCE_TO_A_CLASS; 
String json = EXAMPLE_JSON_HERE; 
JSONArray jsonArray = new JSONArray(json); 
int len = jsonArray.length(); 
for (int i = 0; i < len; i++) { 
    objects.add(mapper.readValue(new JSONObject(json).toString(), pojoReference)); 
} 

Vielen Dank an alle für Ihre Zeit!

1

Die Dokumentation der fromJson() Methode besagt, dass der Objekttyp, von dem Sie das JSON deserialisieren, nicht generisch sein kann. Sie können einen Typ angeben und das @ SerializedName-Attribut wie oben erwähnt verwenden, um das Problem der nicht übereinstimmenden Umhüllung zu beheben, aber nur, wenn Sie den Typ des Objekts kennen, das Sie aus JSON erstellen.

+0

Danke für den Eingang @Tyler, aber ich sagte, das ist keine Option für mich. – Bonifacio

Verwandte Themen