2016-04-14 3 views
3

Ich bin ziemlich neu zu Json und normalerweise donot verwenden viel Codierung. Ich möchte einen Dienst, der als Eingang unter JSON-String nimmtSchneiden Sie die JSON-Zeichenfolge in zwei verschiedene JSON-Zeichenfolge in Java

{ 
    "var": "test11", 
    "_env": { 
     "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", 
     "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", 
     "eventID": 49167, 
     "recvTime": "Thu Apr 14 00:27:03 PDT 2016" 
    } 
} 

und ausspucken Ausgabe als

{ 
    "var": "test11" 
} 

und

{ 
    "_env": { 
     "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", 
     "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", 
     "eventID": 49167, 
     "recvTime": "Thu Apr 14 00:27:03 PDT 2016" 
    } 
} 

Das ist nur ein Beispiel. Es kann mehr Objekte in der JSON-Zeichenfolge enthalten und _env wird nicht immer am Ende angezeigt.

Gibt es einen einfachen Weg, mit Jackson API zu erreichen?

+0

Kennen Sie den Namen aller Schlüssel im ursprünglichen JSON und die Schlüssel, die Sie trennen möchten? – marrock

Antwort

3

Erstellen Sie eine Klasse Ihre JSON zu halten, wie unten:

public class Bar { 

    private String var; 

    @JsonProperty("_env") 
    private Object env; 

    public String getVar() { 
     return var; 
    } 

    public void setVar(String var) { 
     this.var = var; 
    } 

    public Object getEnv() { 
     return env; 
    } 

    public void setEnv(Object env) { 
     this.env = env; 
    } 
} 

Und die Mapper auf nicht auf unbekannten Eigenschaften nicht vor Deserialisieren;

public static void main(String[] argv) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

    Bar bar = mapper.readValue(JSON, Bar.class); 

} 

Auf diese Weise, sowohl wenn die _env vorhanden ist oder nicht, wird es funktionieren.

Wenn Sie auf „Split“ die json von jedem Knoten, können Sie etwas tun:

JsonNode node = mapper.readTree(JSON); 
List<String> nodeJsons = new ArrayList<>(); 
Iterator<Entry<String, JsonNode>> nodeIterator = node.fields(); 
while (nodeIterator.hasNext()) { 
    Map.Entry<String, JsonNode> entry = nodeIterator.next(); 
    nodeJsons.add(mapper.writeValueAsString(entry)); 
} 

diese Weise können Sie mit jedem Knoten am Ende eine Liste der json Strings müssen von selbst serialisiert , statt einer "großen" JSON mit allem.

+0

Ich denke, es ist eine gute Antwort. –

1

mit dynamischem Eingang, ist es am besten json in eine Karte zu laden:

public static void main(String[] args) 
{ 
    ObjectMapper mapper = new ObjectMapper(); 
    try (Reader reader = new FileReader("C://Temp/xx.json")) { 
     // load whatever json into Map 
     @SuppressWarnings("unchecked") 
     Map<String, Object> inMap = mapper.readValue(reader, Map.class); 
     System.out.println(inMap); 
     // exmaple for generating json for each key found 
     for (String key : inMap.keySet()) { 
      mapper.writeValue(System.out, Collections.singletonMap(key, inMap.get(key))); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Keine Notwendigkeit für benutzerdefinierte Klasse und obskuren jacksons Konfiguration. Was auch immer in der Eingabe ist, wird in die Map geladen. Sie können einen JSON für jeden einzelnen Schlüssel erstellen oder den Karteninhalt beliebig interagieren.

Verwandte Themen