2015-11-09 15 views
6

Tôi đã cố gắng xây dựng một chuỗi JSON bằng Java sử dụng thư viện Jackson (v.1.7.4, đó là chuỗi duy nhất tôi có thể sử dụng cho dự án này) cho định dạng được chấp nhận bởi jsTree (https://www.jstree.com/docs/json/). Tôi chỉ quan tâm đến các thuộc tính "văn bản" và "trẻ em". Vấn đề là, tôi không nhận được một phương pháp đệ quy làm việc để làm như vậy.Đệ quy xây dựng một chuỗi JSON thành jsTree với Jackson

Nếu tôi có một cây đơn giản như thế này:

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'd mong đợi Chuỗi tôi là:

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

Tôi đang cố gắng để xây dựng chuỗi JSON sử dụng cây mẫu từ Jackson. Mã của tôi cho đến nay trông giống như sau:

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

} 

Tôi đã thử một vài biến thể nhưng không thành công cho đến nay. Tôi biết câu trả lời có lẽ đơn giản hơn tôi đang cố gắng, nhưng tôi bị kẹt. Có lẽ điều kiện dừng là không thích hợp hoặc logic chính nó (suy nghĩ của tôi là cố gắng và tái sử dụng các đối tượng ObjectNode và ArrayNode trên cuộc gọi tiếp theo, để "chèn" phần tử "con" (từ json) vào nút con tiếp theo trên cây, vì vậy nó sẽ được xây dựng ngược, nhưng cuối cùng tôi nhận được biến null).

cây và nút lớp của tôi đều dựa trên những điều sau đây: http://sujitpal.blogspot.com.br/2006/05/java-data-structure-generic-tree.html

Trả lời

2

Không phải là phương pháp tốt nhất, nhưng nó được công việc làm:

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)); 
    } 
} 
Các vấn đề liên quan