Active Directory OU树到jqTree

时间:2012-12-04 10:27:33

标签: c# json active-directory jqtree

我需要从Active Directory OU创建有效的jqTree JSON结构。我正在测试一个递归方法(InfoNode),但我无法得到它。

生成的json进入字符串json。要处理的第一个节点是具有默认域根的DirectoryEntry父节点。获取递归方法(InfoNode) 当前子节点,按“OU”过滤并创建JSON属性“label”和“path”。在检查此节点是否有更多子节点写入当前JSON项的末尾之前。最后,如果有更多子项,请再次运行方法(InfoNode):

public static DirectoryEntry root = new DirectoryEntry("LDAP://RootDSE");
public string dom = (string)root.Properties["defaultNamingContext"].Value;

public string json = "";

public Form1()
{
    InitializeComponent();
    DirectoryEntry parent = new DirectoryEntry("LDAP://" + dom);
    InfoNode(parent);
    System.IO.File.WriteAllText(@"json.txt", json);
}

void InfoNode(DirectoryEntry node)
{
    string[] arr = node.Name.Split('=');

    if (arr[0] == "OU")
    {
        json += "'children':[{'label':'" + arr[1] + "','path':'" + node.Path + "'";

        if (nodo.Children == null)
        {
            json += "}]";
        }
        else
        {
            json += ",";
        }              
    }

    if (node.Children != null)
    {
        foreach (DirectoryEntry child in node.Children)
        {
            InfoNode(child);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您应该提供有关代码失败的详细信息。

我会试一试: - )

您可以尝试修改代码,如下所示。 不是最优的(在分割之前使用startswith,更多string.Format,在递归调用方法之前测试带有startswith的子项会更好),但我想它应该可以工作。

当您在树中前进时,可能需要从ldap源加载子项。

public string json = "";

public Form1()
{
    InitializeComponent();
    DirectoryEntry parent = new DirectoryEntry("LDAP://" + dom);
    json = InfoNode(parent);
    System.IO.File.WriteAllText(@"json.txt", json);
}

public string InfoNode(DirectoryEntry node)
{
    string[] arr = node.Name.Split('=');
    var result = string.Empty;

    if (arr[0].Equals("ou",StringComparison.InvariantCultureIgnoreCase))
    {
        result = "'{'label':'" + arr[1] + "','path':'" + node.Path + "'";

        if (node.Children.Cast<DirectoryEntry>().Any())
        {
            result += String.Format(", children:[{0}]",
                                    String.Join(",\n ",
                                                node.Children.Cast<DirectoryEntry>()
                                                    .Select(InfoNode).Where(s=>!string.IsNullOrEmpty(s))
                                                    .ToArray()));
        }
        result += "}";
    }
    return result;
}