Recursively building a JSON string for jsTree using Jackson

I tried to create a JSON string in Java using the Jackson library (v.1.7.4, this is the only one I can use for this project) in the format accepted by jsTree ( https://www.jstree.com/docs/json/ ) . I’m only interested in the text and children properties. The problem is that I am not getting a working recursive method.

If I have a simple tree like this:

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); 

I expect my line to be:

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

I am trying to build a JSON string using Jackson's Tree Model. My code still looks something like this:

  public String generateJSONfromTree(Tree<String> tree) throws IOException{ String json = ""; 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); JsonNode rootNode = mapper.createObjectNode(); JsonNode coreNode = mapper.createObjectNode(); JsonNode dataNode = (ArrayNode)generateJSON(tree.getRootElement()); // the tree nodes // assembly arrays and objects ((ObjectNode)coreNode).put("data", dataNode); ((ObjectNode)rootNode).put("core", coreNode); mapper.writeTree(generator, rootNode); json = out.toString(); return json; } public ArrayNode generateJSON(Node<String> node, ObjectNode obN, ArrayNode arrN){ // stop condition ? if(node.getChildren().isEmpty()){ arrN.add(obN); return arrN; } obN.put("text", node.getData()); for (Node<String> child : node.getChildren()){ // recursively call on child nodes passing the current object node obN.put("children", generateJSON(child, obN, arrN)); } } 

I tried several variations of this, but so far have not achieved anything. I know the answer is probably simpler than I'm trying, but I'm stuck. Maybe the stop condition is not suitable or the logic itself (my idea is to try to reuse ObjectNode and ArrayNode objects on the next call to "insert" the "children" element (from json) of the next child node element in the tree, so it will be built back, but in the end I get null variables).

My tree and node classes are based on the following: http://sujitpal.blogspot.com.br/2006/05/java-data-structure-generic-tree.html

+6
source share
1 answer

Not the best approach, but it does its job:

 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)); } } 
+2
source

All Articles