【C#方法】将对象实例转化为JSON字符串

第一、开发原因:

要做一个前台显示服务器文件的网页,想用JS控件做,数据格式使用JSON。所以就写将某目录转化成JSON字符串,但是突然觉得拼凑太啰嗦,而且定制化太高,不灵活,所以索性就写将C#中的DirectoryInfo实例递归下去找到所有子文件夹和文件,然后输出成JSON字符串。

紧接着,发现很多C#数据模型都是一样的结构,比如SHarepoint中的网站和子网站,每个网站有列表或文档库。那何不扩展一下呢。

第二、基本原理:

使用Type.InvokeMember()执行实例的方法和取得属性。

string path = @"E:\Work\test";

DirectoryInfo folder = new DirectoryInfo(path);

Type type = foldera.GetType();

FileInfo[] files = (FileInfo[])type.InvokeMember("GetFiles", BindingFlags.Default | BindingFlags.InvokeMethod, null, folder, new object[] { });
String Name = (String)type.InvokeMember("Name", BindingFlags.Default | BindingFlags.GetProperty, null, folder, new object[] { });

第三、全部代码:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Reflection;



namespace GetFolderJsonData

{

    class Program

    {

        public static string[] ZIJINames = new string[] { "Folder" };

        public static string[] FUSHUNames = new string[] { "Files" };

        public static string[] ZIJIMethods = new string[] { "GetDirectories" };

        public static string[] FUSHUMethods = new string[] { "GetFiles" };

        public static string[] ZIJIFields = new string[] { "Name" };

        public static string[] FUSHUFields = new string[] { "Name", "Extension" };

        public static string resultJson = "";



        static void Main(string[] args)

        {

            string path = @"E:\Work_28528033\test";

            DirectoryInfo foldera = new DirectoryInfo(path);

            string dd = "GetFiles";

            Type type = foldera.GetType();

            FileInfo[] files = (FileInfo[])type.InvokeMember(dd, BindingFlags.Default | BindingFlags.InvokeMethod, null, foldera, new object[] { });

            resultJson += "{";

            GetJsonDataFromObject(foldera);

            resultJson += "}";

            Write();



        }



        public static void Write()

        {

            FileStream fs = new FileStream(@"E:\Work_28528033\result.txt", FileMode.Create);

            //获得字节数组

            byte[] data = System.Text.Encoding.Default.GetBytes(resultJson);

            //开始写入

            fs.Write(data, 0, data.Length);

            //清空缓冲区、关闭流

            fs.Flush();

            fs.Close();

        }

        

        //public static string GetJsonData(string path)

        //{

        //    string resultJson="[{";

        //    DirectoryInfo folder = new DirectoryInfo(path);

        //    if (folder.GetDirectories().Length > 0)

        //    {

        //        resultJson += "Folder:";

        //        foreach (DirectoryInfo f in folder.GetDirectories())

        //        {

        //            resultJson += "";

        //            GetJsonData(folder.FullName);

        //        }

        //        resultJson += "";

        //    }

        //    if (folder.GetFiles().Length>0)

        //    {

        //        resultJson += "";

        //        foreach (FileInfo file in folder.GetFiles())

        //        {

        //            resultJson += "";

        //        }

        //        resultJson += "";

        //    }

        //    return resultJson += "}]";

        //}

        



        public static string GetJsonDataFromObject(object folder) 

        {

            Type type = folder.GetType();

            int diguiInt = -1;

            foreach (string ZIJIMethodsItem in ZIJIMethods)

            {

                diguiInt++;

                object[] folders = (object[])type.InvokeMember(ZIJIMethodsItem, BindingFlags.Default | BindingFlags.InvokeMethod, null, folder, new object[] { });

                if (folders.Length>0)

                {

                    resultJson += ZIJINames[diguiInt] + ":[";

                    foreach (object dir in folders)

                    {

                        resultJson += "{";

                        Type diguiType = dir.GetType();

                        foreach (string ZIJINamesItem in ZIJIFields)

                        {

                            resultJson += ZIJINamesItem+":\"";

                            resultJson += diguiType.InvokeMember(ZIJINamesItem, BindingFlags.Default | BindingFlags.GetProperty, null, dir, new object[] { }).ToString()+"\",";

                        }

                        GetJsonDataFromObject(dir);

                        resultJson += "},";

                    }

                    resultJson = resultJson.Substring(0, resultJson.Length - 1);

                    resultJson += "],";

                }

            }

            int FUSHUMethodsInt = -1;

            foreach (string FUSHUMethodsItem in FUSHUMethods)

            {

                FUSHUMethodsInt++;

                object[] files = (object[])type.InvokeMember(FUSHUMethodsItem, BindingFlags.Default | BindingFlags.InvokeMethod, null, folder, new object[] { });

                if (files.Length>0)

                {

                    resultJson +=FUSHUNames[FUSHUMethodsInt] + ":[";

                    foreach (object fileItem in files)

                    {

                        resultJson += "{";

                        Type proType = fileItem.GetType();

                        foreach (string FUSHUFieldsItem in FUSHUFields)

                        {

                            resultJson += FUSHUFieldsItem + ":\"";

                            resultJson += proType.InvokeMember(FUSHUFieldsItem, BindingFlags.Default | BindingFlags.GetProperty, null, fileItem, new object[] { }).ToString() + "\",";

                        }

                        resultJson = resultJson.Substring(0, resultJson.Length - 1);

                        resultJson += "},";

                    }

                    resultJson = resultJson.Substring(0, resultJson.Length - 1);

                    resultJson += "]";

                }

            }

            return resultJson;

        }

    }

}

 

结束语:

http://www.bejson.com/  JSON格式化工具(随便搜了一个,不一定是最好的)

使用:

ZIJI代表与与传入类型相同。

FUSHU代表这种类型实例包含的另外一种类型的实例。

Field是字段。

Name是显示在JSON中的名字。Name与Method相对应。

如果还是看不懂那太正常了,自己做一个文件夹试试吧。

附上测试文件夹,工程代码,得到结果:

{

    Folder: [

        {

            Name: "1.1F",

            Folder: [

                {

                    Name: "1.1.1F",

                    Files: [

                        {

                            Name: "1.1.1.1 (1).txt",

                            Extension: ".txt"

                        },

                        {

                            Name: "1.1.1.1 (2).txt",

                            Extension: ".txt"

                        },

                        {

                            Name: "1.1.1.1.txt",

                            Extension: ".txt"

                        }

                    ]

                }

            ],

            Files: [

                {

                    Name: "1.1.1.txt",

                    Extension: ".txt"

                },

                {

                    Name: "1.1.2.txt",

                    Extension: ".txt"

                },

                {

                    Name: "1.1.3.txt",

                    Extension: ".txt"

                }

            ]

        },

        {

            Name: "1.2F",

            Files: [

                {

                    Name: "1.2.1.txt",

                    Extension: ".txt"

                },

                {

                    Name: "1.2.2.txt",

                    Extension: ".txt"

                },

                {

                    Name: "1.2.3.txt",

                    Extension: ".txt"

                }

            ]

        }

    ],

    Files: [

        {

            Name: "1.1.txt",

            Extension: ".txt"

        },

        {

            Name: "1.2.txt",

            Extension: ".txt"

        },

        {

            Name: "1.3.txt",

            Extension: ".txt"

        }

    ]

}

http://files.cnblogs.com/files/yixiaozi/GetFolderJsonData.rar

http://files.cnblogs.com/files/yixiaozi/GetFolderJsonDatatestFolder.rar

 

你可能感兴趣的:(json)