2013-09-26 14 views
5

Ich habe mit dem groovigen Jsonbuilder experimentiert, wie Sie unten sehen können, indem Sie verschiedene Möglichkeiten zum Erstellen von JSON-Objekten und -Arrays betrachten. Nachdem alles anfing Sinn zu machen, versuchte ich, zu erweitern, was unten gezeigt ist. Die Frage, die ich habe, ist, warum "Inhalt" in der json hübschen Zeichenkettenausgabe auftaucht? Ich habe tatsächlich ein anderes JSON-Objekt, das diese.class-Informationen in JSON-String-Ausgaben anzeigt.JSON-Ausgabe mit Groovy

Irgendwelche Ideen? Ich bin neu in diesem Bereich, also könnte es eindeutig sein.

def tt = ["test", "test1"] 
       def jjj = "jason" 
       def js3 = new groovy.json.JsonBuilder() 
       def js2 = new groovy.json.JsonBuilder(tt); 
       js3 hello: "$jjj", "$jjj": tt 
       def js4 = new groovy.json.JsonBuilder() 
       def result = js4([sdn: js3, openflow: js2, type: 3]) 
       println js4.toPrettyString(); 


{ 
"sdn": { 
    "content": { 
     "hello": "jason", 
     "jason": [ 
      "test", 
      "test1" 
     ] 
    } 
}, 
"openflow": { 
    "content": [ 
     "test", 
     "test1" 
    ] 
}, 
"type": 3 

}

Antwort

9

Das Problem angepasst werden kann ...

warum tut dies:

import groovy.json.* 

def js3 = new JsonBuilder(["test", "test1"]) 
def js4 = new JsonBuilder(js3) 
println js4.toString() 

Druck:

{"content":["test","test1"]} 

und dieses:

import groovy.json.* 

def js3 = new JsonBuilder(["test", "test1"]) 
def js4 = new JsonBuilder(js3.content) 
println js4.toString() 

druckt diese (?):

["test","test1"] 

Die kurze Antwort ist, dass JsonBuilder ein Mitglied hat content genannt, die die Nutzlast darstellt. Wenn ein JsonBuilder einen anderen absorbiert, wollen wir die Nutzlast ersetzen und nicht verschachteln. Diese Linie ist der Weg, um die Nutzlast zu ersetzen:

def js4 = new JsonBuilder (js3.content)

Letztlich dies aus der Tatsache stammt, dass JsonBuilder.toString() (code here) ruft JsonOutput.toJson(object) (code here).

Eine Übung für den Leser ist zu experimentieren:

class MyBuilder { 
    def content 
} 

def myB = new MyBuilder(content: ["test", "test1"]) 
println JsonOutput.toJson(myB) 
println JsonOutput.toJson(myB.content) 
+0

Es ist eine sehr gute Erklärung ist. Vielleicht möchten Sie die "Code here" -Links aktualisieren, nachdem Groovy-Quellen verschoben wurden. –

+1

Ausgezeichnete Antwort, half eine Tonne, danke –