void CreateNodes(Node node, NodeObject parent, int layer)
    {
        GameObject go      = Instantiate(nodeObject);
        NodeObject nodeObj = go.GetComponent <NodeObject>();

        nodes.Add(nodeObj);
        nodeObj.node = node;
        // In the Json, the splitrule is only a string, we want to know which actual class the rule belongs to
        nodeObj.DetectSplitrule();

        nodeObj.parent = parent;

        nodeObj.layer = layer;

        if (layer > highestNodeLayer)
        {
            highestNodeLayer = layer;
        }

        //if the parent is not null, set the previous node as the parent of this node
        if (parent != null)
        {
            //go.transform.SetParent(parent.transform);
            parent.childrenObjects.Add(nodeObj);
        }

        // if children are null, then it is a leaf
        if (node.children.Length == 0)
        {
            Debug.Log("Null children", nodeObj);
            return;
        }

        for (int i = 0; i < node.children.Length; i++)
        {
            if (node.children[i] != null)
            {
                // set up the edge
                EdgeObject edge = Instantiate(edgeObject);
                edge.transform.SetParent(go.transform);

                nodeObj.edges.Add(edge);
                edge.splitText.text = node.children[i].split;

                CreateNodes(node.children[i].targetNode, nodeObj, nodeObj.layer + 1);
            }
        }
    }