2015-11-09 9 views
6

Ich habe versucht, eine JSON - Zeichenfolge in Java mit der Jackson - Bibliothek (v.1.7.4, es ist die einzige, die ich für dieses Projekt verwenden kann) zu erstellen Format akzeptiert von jsTree (https://www.jstree.com/docs/json/). Mir sind nur die Eigenschaften "Text" und "Kinder" wichtig. Das Problem ist, ich bekomme keine funktionierende rekursive Methode dafür.Rekursive Erstellung einer JSON - Zeichenfolge an jsTree mit Jackson

Wenn ich einen einfachen Baum wie diese:

Tree<String> tree = new Tree<String>(); 
    Node<String> rootNode = new Node<String>("root"); 
    Node<String> nodeA = new Node<String>("A"); 
    Node<String> nodeB = new Node<String>("B"); 
    Node<String> nodeC = new Node<String>("C"); 
    Node<String> nodeD = new Node<String>("D"); 
    Node<String> nodeE = new Node<String>("E"); 

    rootNode.addChild(nodeA); 
    rootNode.addChild(nodeB); 
    nodeA.addChild(nodeC); 
    nodeB.addChild(nodeD); 
    nodeB.addChild(nodeE); 

    tree.setRootElement(rootNode); 

Id erwarten meine String zu sein:

{text: "root", children: [{text:"A", children:[{text:"C", children: []}]}, {text:"B", children: [{text: "D", children: []}, {text:"E", children:[]}]}] } 

Ich versuche die JSON-String mit dem Tree Model zu bauen von Jackson. Mein Code sieht in etwa so aus:

Ich habe versucht ein paar Variationen davon, aber bisher keinen Erfolg. Ich weiß, dass die Antwort wahrscheinlich einfacher ist als ich es versuche, aber ich stecke fest. Vielleicht ist die Stop-Bedingung nicht passend oder die Logik selbst (mein Gedanke ist es, die ObjectNode- und ArrayNode-Objekte beim nächsten Aufruf wieder zu verwenden, um das "Children" -Element (aus dem JSON) auf dem nächsten Kind-Knoten auf dem "einzufügen" Baum, so würde es rückwärts gebaut werden, aber am Ende bekomme ich null Variablen).

werden Meine Baum und Knotenklassen basieren auf dem folgenden: http://sujitpal.blogspot.com.br/2006/05/java-data-structure-generic-tree.html

Antwort

2

nicht den besten Ansatz, aber es wird die Arbeit getan:

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.util.Iterator; 

import com.fasterxml.jackson.core.JsonEncoding; 
import com.fasterxml.jackson.core.JsonFactory; 
import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.node.ArrayNode; 
import com.fasterxml.jackson.databind.node.ObjectNode; 

public class TreeApp { 

    public String generateJSONfromTree(Tree<String> tree) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonFactory factory = new JsonFactory(); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); // buffer to write to string later 
     JsonGenerator generator = factory.createJsonGenerator(out, JsonEncoding.UTF8); 

     ObjectNode rootNode = generateJSON(tree.getRootElement(), mapper.createObjectNode()); 
     mapper.writeTree(generator, rootNode); 

     return out.toString(); 
    } 

    public ObjectNode generateJSON(Node<String> node, ObjectNode obN) { 
     if (node == null) { 
      return obN; 
     } 

     obN.put("text", node.getData()); 

     ArrayNode childN = obN.arrayNode(); 
     obN.set("children", childN);   
     if (node.getChildren() == null || node.getChildren().isEmpty()) { 
      return obN; 
     } 

     Iterator<Node<String>> it = node.getChildren().iterator(); 
     while (it.hasNext()) { 
      childN.add(generateJSON(it.next(), new ObjectMapper().createObjectNode())); 
     } 
     return obN; 
    } 

    public static void main(String[] args) throws IOException { 
     Tree<String> tree = new Tree<String>(); 
     Node<String> rootNode = new Node<String>("root"); 
     Node<String> nodeA = new Node<String>("A"); 
     Node<String> nodeB = new Node<String>("B"); 
     Node<String> nodeC = new Node<String>("C"); 
     Node<String> nodeD = new Node<String>("D"); 
     Node<String> nodeE = new Node<String>("E"); 

     rootNode.addChild(nodeA); 
     rootNode.addChild(nodeB); 
     nodeA.addChild(nodeC); 
     nodeB.addChild(nodeD); 
     nodeB.addChild(nodeE); 

     tree.setRootElement(rootNode); 

     System.out.println(new TreeApp().generateJSONfromTree(tree)); 
    } 
} 
Verwandte Themen