2016-04-01 14 views
1

Ich möchte dieseswie ein Json-Objekt Sammlung deserialisieren jackson mit

{ 
    "0":{"name":"Alice"}, 
    "1":{"name":"Bob"} 
} 

auf eine Java-Sammlung (Set oder Liste, nicht Karte) eine json wie deserialisieren. Ich möchte das Standardverhalten von CollectionDeserializer ändern, um dies zu unterstützen und es als globale Konfiguration zu konfigurieren. Irgendein Weg dazu?

Antwort

0

Wenn Sie wirklich diese Struktur haben (ein Objekt als Container und kein Array, das viel einfacher gehandhabt werden könnte):

import com.fasterxml.jackson.databind.*; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.Map; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     String json = "{\"0\":{\"name\":\"Alice\"}, \"1\":{\"name\":\"Bob\"}}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode obj = mapper.readValue(json, JsonNode.class); 
     Iterator<Map.Entry<String, JsonNode>> userEntries = obj.fields(); 
     while(userEntries.hasNext()){ 
      Map.Entry<String, JsonNode> userEntry = userEntries.next(); 
      System.out.println(userEntry.getKey() + " => " + userEntry.getValue()); 
     } 
    } 
} 
+0

Gibt es eine Möglichkeit, dieses Verhalten als globale Konfiguration festzulegen? Ich benutze es im Frühjahr Web-MVC-Projekt, ich möchte diesen Deserialize-Code nicht überall schreiben. – sun

+0

Ja, siehe Abschnitt: "Erstellen Sie einen benutzerdefinierten ObjectMapper, indem Sie den Standard Jackson ObjectMapper erweitern. ": http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html –

1

Sie können diese Aufgabe erreichen Gson api verwenden. Der Code ist wie folgt:

String yourJson = "{\"0\":{\"name\":\"Alice\"}, \"1\":{\"name\":\"Bob\"}}"; 
Gson gson = new Gson(); 
Type tarType = new TypeToken<Map<String,Map<String,String>>>(){ 
}.getType(); 
gson.fromJson(yourJson, tarType); 

Dazu Sie hinzufügen müssen folgende: com.google.gson.Gson

0

Warum nicht Ihr JSON-Dokument in ein Array zu drehen, da:

{"persons":[{"name":"Alice"},{"name":"Bob"}]} 

dann ein entsprechendes JSON Schema definieren (PersonArray Annahme, daß der Dateiname):

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "description": "Some description", 
    "type" : "object", 
    "properties" : { 
    "persons" : { 
     "type" : "array", 
     "items" : { "$ref": "#/definitions/person" } 
    } 
    }, 

    "definitions": { 
    "person" : { 
     "type": "object", 
     "description": "A person", 
     "properties": { 
      "name": { "type": "string" } 
     } 
    } 
    } 
} 

und nutzen Sie die Jackson Data Binding API, indem Sie das Maven Plugin jsonschema2pojo-maven-plugin verwenden, um POJOs in Java zu generieren (alternativ können Sie POJOs manuell implementieren).

Sobald POJOs generiert werden, können Sie ObjectMapper verwenden JSON-Dokument in folgender Weise deserialise:

List<Person> persons = new ArrayList<Person>(); 

:

ObjectMapper mapper = new ObjectMapper(); 
PersonArray personArray = mapper.readValue(serialisedJsonDocument, PersonArray.class); 

Die Elemente Ihrer JSON Dokument wird innerhalb PersonArray Objekt als gespeichert werden Sie könnten dem Objekt Person zusätzliche Eigenschaften hinzufügen, wenn Sie es benötigen.

Verwandte Themen