Id      CategoryName   ParentId
1 ic         0         
2 T卡         0         
3 三极管        0         
4 贴片         1         
6 Tm445      4         
7 B445       4         
8 DF23       2         
10 bn22       4         
11 BB33       7     
数据表中的数据结构如上,要把取出来的数据拼接成下列字符串:
[{'val':'1','txt':'ic','menu':[{'val':'4','txt':'贴片','menu':[{'val':'7','txt':'B445'},{'val':'8','txt':'DF23'},{'val':'10','txt':'bn22'}]}]},{'val':'2','txt':'T卡','menu':[{'val':'6','txt':'Tm445'}]},{'val':'3','txt':'三极管'}]如题没有子集的格式为{'val':'3','txt':'三极管'},
有子集的为{'val':'2','txt':'T卡','menu':[{'val':'6','txt':'Tm445'}]}
有三级子集的为{'val':'1','txt':'ic','menu':[{'val':'4','txt':'贴片','menu':[{'val':'7','txt':'B445'},{'val':'8','txt':'DF23'}然后以此类推,可能有4级、5级。

解决方案 »

  1.   

    class MyClass
    {
        public MyClass(string onlyMenu)
        {
            this.Val = 0;
            this.Txt = "";
            this.Menu = this.Split(onlyMenu);
            this.Parent = 0;
        }    public MyClass(string input, int parent)
        {
            Match m = Regex.Match(input, @"'val':'([^']+)','txt':'([^']+)','menu':\[(.*)\]");
            if (m.Success)
            {
                this.Val = int.Parse(m.Groups[1].Value);
                this.Txt = m.Groups[2].Value;
                this.Parent = parent;
                this.Menu = this.Split(m.Groups[3].Value);
                return;
            }        m = Regex.Match(input, @"'val':'([^']+)','txt':'([^']+)");
            if (m.Success)
            {
                this.Val = int.Parse(m.Groups[1].Value);
                this.Txt = m.Groups[2].Value;
                this.Parent = parent;
                this.Menu = new MyClass[0];
                return;
            }        throw new FormatException();
        }    public int Val { get; set; }
        public string Txt { get; set; }
        public MyClass[] Menu { get; set; }
        public int Parent { get; set; }    public MyClass[] Split(string input)
        {
            List<MyClass> list = new List<MyClass>();
            int brace = 0;
            int left = 0;
            int count = 0;        for (int i = 0; i < input.Length; i++)
            {
                if (input[i] == '{') brace++;
                if (input[i] == '}') brace--;
                if (brace == 0)
                {
                    if (count != 0)
                    {
                        string sub = input.Substring(left, count);
                        list.Add(new MyClass(sub + '}', this.Val));
                    }
                    left = i + 1;
                    count = 0;
                }
                else if (brace > 0) count++;
                else throw new FormatException();
            }        if (brace != 0) throw new FormatException();
            return list.ToArray();
        }
    }static void EnumAll(MyClass parent, ICollection<MyClass> collection)
    {
        if (collection == null) throw new ArgumentNullException();
        collection.Add(parent);
        foreach (var item in parent.Menu)
        {
            EnumAll(item, collection);
        }
    }static void Main(string[] args)
    {
        string input = @"[{'val':'1','txt':'ic','menu':[{'val':'4','txt':'贴片','menu':[{'val':'7','txt':'B445'},{'val':'8','txt':'DF23'},{'val':'10','txt':'bn22'}]}]},{'val':'2','txt':'T卡','menu':[{'val':'6','txt':'Tm445'}]},{'val':'3','txt':'三极管'}]";
        MyClass c = new MyClass(input);
        List<MyClass> list = new List<MyClass>();
        EnumAll(c, list);
        list.Sort((p, q) => p.Val - q.Val);
        Console.WriteLine("Id CategoryName ParentId");
        foreach (var item in list)
        {
            Console.WriteLine("{0,2} {1,12} {2,8}", item.Val, item.Txt, item.Parent);
        }
        Console.ReadKey();
    }
    把昨天的改了改,又发上来了你给的字符串里只有10个,没有11昨天版主的正则我还没弄明白,学习ing
      

  2.   

    输出
    Id CategoryName ParentId
     0                     0
     1           ic        0
     2           T卡        0
     3          三极管        0
     4           贴片        1
     6        Tm445        2
     7         B445        4
     8         DF23        4
    10         bn22        4
      

  3.   

    晕 我昨天不看题在胡写什么啊
    听别人说有json.net这么个东西
    http://json.codeplex.com/
    学习了一下
    [JsonObject(MemberSerialization.OptOut)]
    class MyClass
    {
        [JsonProperty(PropertyName = "val")]
        public string Id { get; set; }
        [JsonProperty(PropertyName = "txt")]
        public string CategoryName { get; set; }
        [JsonProperty(PropertyName = "menu", NullValueHandling = NullValueHandling.Ignore)]
        public List<MyClass> Menu { get; set; }
        [JsonIgnore]
        public string ParentId { get; set; }
    }static void Main(string[] args)
    {
        string input = @"1 ic 0 
                    2 T卡 0 
                    3 三极管 0 
                    4 贴片 1 
                    6 Tm445 4 
                    7 B445 4 
                    8 DF23 2 
                    10 bn22 4 
                    11 BB33 7";
        Dictionary<string, MyClass> dict = new Dictionary<string, MyClass>();
        foreach (var item in input.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries))
        {
            string[] strs = item.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            MyClass tmp = new MyClass()
            {
                Id = strs[0],
                CategoryName = strs[1],
                Menu = new List<MyClass>(),
                ParentId = strs[2]
            };
            dict.Add(strs[0], tmp);
            if (dict.ContainsKey(strs[2]))
            {
                dict[strs[2]].Menu.Add(tmp);
            }
        }    foreach (var item in dict)
        {
            if (item.Value.Menu.Count == 0)
            {
                item.Value.Menu = null;
            }
        }    string result = JsonConvert.SerializeObject(dict.Values.Where(p => p.ParentId == "0"));
        Console.WriteLine(result);
        Console.ReadKey();
    }
    添加引用\bin\net40\Newtonsoft.Json.dll,我用的4.0
    然后using Newtonsoft.Json;
      

  4.   

    递归添加到集,在序列化
    [DataContract]
    public class Category
    {
        [DataMember(Name = "val", Order = 0)]
        public int ID { get; set; }
        [DataMember(Name = "txt", Order = 1)]
        public string CategoryName { get; set; }
        [DataMember(Name = "menu", Order = 2, EmitDefaultValue = false)]
        public List<Category> Categorys { get; set; }
    }public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("CategoryName", typeof(string));
            dt.Columns.Add("ParentID", typeof(int));
            dt.Rows.Add(new object[] { 1, "ic", 0 });
            dt.Rows.Add(new object[] { 2, "T卡", 0 });
            dt.Rows.Add(new object[] { 3, "三极管", 0 });
            dt.Rows.Add(new object[] { 4, "帖片", 1 });
            dt.Rows.Add(new object[] { 6, "Tm445", 4 });
            dt.Rows.Add(new object[] { 7, "B445", 4 });
            dt.Rows.Add(new object[] { 8, "DF23", 2 });
            dt.Rows.Add(new object[] { 10, "bn22", 4 });
            dt.Rows.Add(new object[] { 11, "BB33", 7 });
            List<Category> list = new List<Category>();
            GetSon(dt, 0, list);
            DataContractJsonSerializer json = new DataContractJsonSerializer(list.GetType());
            MemoryStream ms = new MemoryStream();
            json.WriteObject(ms, list);
            string result = Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            ms.Dispose();
            Response.Write(result);
        }
        public void GetSon(DataTable dt, int ParentID, List<Category> list)
        {
            DataRow[] row = dt.Select("ParentID=" + ParentID);
            foreach (DataRow r in row)
            {
                int id = Convert.ToInt32(r["ID"]);
                Category c = new Category() { ID = id, CategoryName = r["CategoryName"].ToString(), Categorys = new List<Category>() };
                list.Add(c);
                GetSon(dt, id, c.Categorys);
                if (c.Categorys.Count == 0)
                    c.Categorys = null;
            }
        }
    }
    /*
    [{"val":1,"txt":"ic","menu":[{"val":4,"txt":"帖片","menu":[{"val":6,"txt":"Tm445"},{"val":7,"txt":"B445","menu":[{"val":11,"txt":"BB33"}]},{"val":10,"txt":"bn22"}]}]},{"val":2,"txt":"T卡","menu":[{"val":8,"txt":"DF23"}]},{"val":3,"txt":"三极管"}] 
    */