2010-12-21 4 views
2

Ich habe eine Klasse nur triviale Zeichenfolge eingegeben Felder und eine Karte mit:Wie einen Feldnamen zu fieldvalue Karte machen Deserialisieren einen JSON-String


class MyClass { 
    @SerializedName("handle"); 
    String nickName; 
    Map randomDetails; 
} 

Meine Forderung ist es, eine Karte von Feldnamen zu fieldvalue (Map) zu erstellen Die Feldnamen sollten jedoch mit @SerializedName und nicht mit dem Feldnamen von Myclass identisch sein. Mir ist klar, dass ich für einen komplexen Typ wie MyClass möglicherweise selbst eine Deserialisierung auf niedriger Ebene vornehmen muss. Ist jemand darauf gestoßen?

Antwort

0

Wenn Sie eine Bibliothek verwenden, sollten Sie keine Low-Level-Arbeit tun müssen.

Ich habe es (noch) nicht verwendet, aber Jackson sieht aus wie es tun wird, was Sie brauchen.

Es wäre besonders einfach, wenn Sie nicht, dass @SerializedName Annotation zu verwenden, erforderlich, da Jackson eine Reihe von its own annotations bietet, die genau das tun, was Sie brauchen - (siehe @JsonProperty Anmerkung).

Wenn Sie die Jackson Tree Model-Betriebsart verwenden, sollten Sie so etwas wie die kartenbasierten Ergebnisse erhalten, die Sie suchen.

0

(ich glaube, ich verstehe, dass die Frage ist, wie Gson zu verwenden, um eine JSON Map-Struktur auf eine Java Map deserialisieren.)

Gson zur Zeit ein wenig mehr Art Informationen über die Map als die Java-Klassenstruktur benötigt in der ursprünglichen Frage bietet. Anstatt zu erklären, dass randomDetails eine einfache alte Map ist, lassen Sie Gson wissen, dass es ein Map<String, String> ist. Dann wird das folgende Beispiel für JSON und einfachen Deserialisierungscode wie erwartet ausgeführt.

input.json Inhalt:

{ 
    "handle":"the handle", 
    "random_details":{"one":1,"too":"B","3":false,"for":5.32} 
} 

Foo.java:

import java.io.FileReader; 
import java.util.Map; 

import com.google.gson.FieldNamingPolicy; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.SerializedName; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
    Gson gson = gsonBuilder.create(); 
    MyClass myObject = gson.fromJson(new FileReader("input.json"), MyClass.class); 
    System.out.println(gson.toJson(myObject)); 
    } 
} 

class MyClass 
{ 
    @SerializedName("handle") 
    String nickName; 
    Map<String, String> randomDetails; 
} 

anzumerken, dass diese alle Werte im Map in Strings umwandelt. Wenn Sie etwas generischeres möchten, z. B. Map<String, Object>, oder randomDetails ein einfaches altes Map ohne zusätzliche Typinformationen sein muss, dann müssen Sie die benutzerdefinierte Deserialisierungsverarbeitung as described in the user guide implementieren. (Dies ist eine Situation, wo Gson leider zur Zeit nicht automatisch Java-Werte von String oder primitive Art von JSON Primitiven erzeugen, wenn der angegebene Java-Typ einfach Object ist. Daher ist es notwendig, die benutzerdefinierte Deserialisierung zu implementieren.)

Hier ist eine solche Beispiel.

+0

Gson-Problem 325 adressiert einfache Deserialisierung zu Map Zögern Sie nicht, für die Implementierung unter code.google.com/p/google-gson/issues/detail?id=325 zu stimmen –

Verwandte Themen