【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

时间: 2024-10-06 14:13:28

【C#方法】将对象实例转化为JSON字符串的相关文章

关于js函数,方法,对象实例的一些说明

朋友们大家好,好久没有更新文章了,最近正好有空就想着写点什么吧,加上这段时间总是能听到一些朋友们问关于js函数,方法,对象实例到底有什么区别这个问题,所以今天就献丑来简单说明一些吧! 其实这些主要都是一些概念上的东西,在这里还是推荐大家多看看诸如<JavaSript权威指南>,<JavaScript高级编程>之类的书籍,当然这些概念如果用代码写出来我相信大家也都还是能够知道的,所以下面我就用文字和代码举一些简单的例子进行说明: 函数:简单的说函数就是,使用function关键字定义

如何将C#对象转化为JSON字符串

System.Web.Extensions.dll中类JavaScriptSerializer可以帮助我们把C#对象转化为JSON字符串. 有一个Person类 1 public class Person 2 { 3 private string name; 4 5 public string Name 6 { 7 get { return name; } 8 set { name = value; } 9 } 10 private int age; 11 12 public int Age 1

java对象转化为json字符串

java对象转化为json字符串,关键代码如下: JSONObject json = JSONObject.fromObject(person); String resultStr = json.toString(); 转化后的字符串形如: {"age":"18","name":"天津犀利妞","password":"123456","sex":"女&quo

Java 对象,数组 与 JSON 字符串 相互转化

当 Java 对象中包含 数组集合对象时,将 JSON 字符串转成此对象. public class Cart{} public class MemberCoupon{} public class CartGroup { private List<Cart> carts = new ArrayList<Cart>(); // 购物车列表 private List<MemberCoupon> coupons = new ArrayList<MemberCoupon&

JS对象转化为JSON字符串

js方法: JSON.stringify 把一个对象转换成json字符串 JSON.parse 把一个json字符串解析成对象. JQ方法: 用jquery的方法 $.parseJSON(jsonString) 在官网下载一个json2.js 然json.parse()方法 这个方法firefox chrome是直接支持的 ie需要引入json2.js

iOS对象(数组)转化为JSon字符串

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #d12f1b; background-color: #ffffff } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; fo

[转][C#]c# 将JSON转化为list实体类,将list实体类转化为JSON字符串

原文地址:http://wo13145219.iteye.com/blog/2022667 using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls

前端js如何生成一个对象,并转化为json字符串

一,直接上代码 <script src="../../Content/jquery-2.0.3.min.js" type="text/javascript"></script> <script type="text/javascript"> function aa() { var json = []; var j = {}; for (var i = 1; i < 5; i++) { j.name = &

jquery扩展方法(表单数据格式化为json对象)

<script type="text/javascript"> // 将表单数据序列化为一个json对象,例如 {"name":"zs", "age":10} // 使用:var jsonObj = $("#formId").serializeObject(); $.fn.serializeObject = function() { var o = {}; var a = this.serial