2015-05-19 43 views
2

我的文件路径的样本输出,这只是一个例子,对于这个问题转换目录路径JSON目录树表示

新建文本文档.txt
新建文件夹/
新建文件夹/ README .TXT

,我想转换到以下JSON

{ 
    "Data":"/", 
    "Nodes":[ 
     { 
     "Data":"New Folder", 
     "Nodes":[ 
      { 
       "Data":"New Text Document.txt" 
      } 
     ] 
     }, 
     { 
     "Data":"New Text Document.txt", 
     "Nodes":[ 
      "" 
     ] 
     } 
    ] 
} 

我的节点类是以下

public class Node 
    { 
     public Node(string fileName) 
     { 
      Nodes = new List<Node>(); 
      Data = fileName; 
     } 

     public List<Node> Nodes { get; set; } 

     public string Data { get; set; } 
    } 

我试图找出算法,如何在Node类中表示文件路径,我将稍后序列化以获取JSON。如果有任何其他方式来表示文件路径为目录树结构JSON,请建议

+0

为什么不使用JSON序列化程序? – MarcinJuraszek

+0

我正在序列化Node类,但我的问题是,我无法将字符串路径转换为Node类表示,以便后续将其序列化。 –

+1

您应该在问题中更清楚地表明问题所在。 – MarcinJuraszek

回答

1

我终于开始为你制作样品了。这应该是一个很好的可扩展的递归解决方案。 :)

static void Main(string[] args) 
{ 
    Node root = new Node("/"); 
    AddNode("New Text Document.txt", root); 
    AddNode("New folder/", root); 
    AddNode("New folder/README.txt", root); 

    Console.ReadKey(); 
} 

public class Node 
{ 
    public Node() { Nodes = new List<Node>(); } 
    public Node(string fileName) 
    { 
     Nodes = new List<Node>(); 
     Data = fileName; 
    } 

    public Node FindNode(string data) 
    { 
     if (this.Nodes == null || !this.Nodes.Any()) { return null; } 

     // check Node list to see if there are any that already exist 
     return this.Nodes 
      .FirstOrDefault(n => String.Equals(n.Data, data, StringComparison.CurrentCultureIgnoreCase)); 
    } 

    public string Data { get; set; } 
    public List<Node> Nodes { get; set; } 
} 

public static Node AddNode(string filePath, Node rootNode) 
{ 
    // convenience method. this creates the queue that we need for recursion from the filepath for you 
    var tokens = filePath.Split('/').ToList(); 

    // if you split a folder ending with/it leaves an empty string at the end and we want to remove that 
    if (String.IsNullOrWhiteSpace(tokens.Last())) { tokens.Remove(""); } 

    return AddNode(new Queue<string>(tokens), rootNode); 
} 

private static Node AddNode(Queue<string> tokens, Node rootNode) 
{ 
    // base case -> node wasnt found and tokens are gone :(
    if (tokens == null || !tokens.Any()) 
    { 
     return null; 
    } 

    // get current token, leaving only unsearched ones in the tokens object 
    string current = tokens.Dequeue(); 

    // create node if not already exists 
    Node foundNode = rootNode.FindNode(current); 
    if (foundNode != null) 
    { 
     // node exists! recurse 
     return AddNode(tokens, foundNode); 
    } 
    else 
    { 
     // node doesnt exist! add it manually and recurse 
     Node newNode = new Node() { Data = current }; 
     rootNode.Nodes.Add(newNode); 
     return AddNode(tokens, newNode); 
    } 
} 
+0

谢谢:)这就是我一直在寻找的 –

0
using System.Web.Script.Serialization; ///name space to use 

    JavaScriptSerializer js = new JavaScriptSerializer(); 
     string json = js.Serialize(pass node class object here); 

下面的代码应该给出所需的目录结构。

static void Main(string[] args) 
{ 
    string path = @"path where to check"; 
    Node n = new Node(); 
    n.Nodes = new List<Node>(); 
    GetNodes(path, n); 
    JavaScriptSerializer js = new JavaScriptSerializer(); 
    string json = js.Serialize(n); 
} 

public static void GetNodes(string path, Node node) 
{ 
    if (File.Exists(path)) 
    { 
     node = new Node(path); 
    } 
    else if (Directory.Exists(path)) 
    { 
     node.Data = "\\"; 
     GetFiles(path, node); 

     foreach (string item in Directory.GetDirectories(path)) 
     { 
      Node n = new Node(); 
      n.Nodes = new List<Node>(); 
      n.Data = item; 
      GetFiles(path, n); 
      node.Nodes.Add(n); 
     } 
    } 
} 

public static void GetFiles(string path, Node node) 
{ 
    foreach (string item in Directory.GetFiles(path)) 
    { 
     node.Nodes.Add(new Node(item)); 
    } 

} 

public class Node 
{ 
    public Node() 
    { } 
    public Node(string fileName) 
    { 
     Nodes = new List<Node>(); 
     Data = fileName; 
    } 

    public List<Node> Nodes { get; set; } 

    public string Data { get; set; } 
} 
+0

问题不在于对象序列化。问题是如何将字符串路径转换为节点对象 –

+0

节点中的字符串路径意味着什么? – Dreamweaver

+0

纯粹为这个例子在这里没有算法 节点root = new Node(“/”); root.Nodes.Add(新节点(“New Text Document.txt”)); root.Nodes.Add(新节点(“新文件夹”)); root.Nodes [0] .Nodes.Add(新节点(“New Text Document.txt”)); 和之后,如果我将序列化像你指出的节点对象,我会得到我想要的结果 –