惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
Scott Helme
Scott Helme
爱范儿
爱范儿
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
V
V2EX
腾讯CDC
博客园_首页
博客园 - 司徒正美
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
小众软件
小众软件
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
罗磊的独立博客
Recorded Future
Recorded Future
博客园 - 聂微东
O
OpenAI News
S
Secure Thoughts
Hacker News: Ask HN
Hacker News: Ask HN
S
Schneier on Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
Y
Y Combinator Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Project Zero
Project Zero
宝玉的分享
宝玉的分享
K
Kaspersky official blog
N
Netflix TechBlog - Medium
T
The Exploit Database - CXSecurity.com
Google Online Security Blog
Google Online Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Webroot Blog
Webroot Blog
云风的 BLOG
云风的 BLOG
Simon Willison's Weblog
Simon Willison's Weblog
C
Check Point Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 热门话题
美团技术团队
L
Lohrmann on Cybersecurity

博客园 - 亦心

教你如何查找并下载某手某音上的外部视频 求出两个字符串中最大长度的相同的子字符串 年会抽奖软件 正则表达式+编码转换小工具 sql语句跨库导入导出 Google maps API开发(二) - 亦心 Google maps API开发(一) - 亦心 Javascript树型菜单(含源码) Javascript结合XML省市级联 - 亦心 - 博客园 ASP.NET程序读取二代身份证(附源码) - 亦心 - 博客园 仿百度搜索智能提示(纯JS实现) 发现一个免费申请国际域名的地方!! asp.net性能优化 分享一个分页存储过程和分页函数 利用反射实现通用的DataReader转List、DataReader转实体类 tsql字符串操作 javascript正则表达式 - 亦心 - 博客园 access、excel取随机n条记录 测试SQL Server执行时间和CPU时间
任意类型转换成json
亦心 · 2009-12-14 · via 博客园 - 亦心

项目中经常要用到json格式的数据,把收集和整理的转换json数据的方法发布如下:

在.net framework2.0中,没有JavaScriptSerializer(3.0) 和DataContractJsonSerializer (3.5),所以经常要用手写的转换类,这样调试也方便些,何况JavaScriptSerializer 和DataContractJsonSerializer 还有一些对特殊字符解析的bug

转载请注明出处:http://www.cnblogs.com/cyan

    /// <summary>

    /// List转成json

    /// </summary>

    /// <typeparam name="T"></typeparam>

    /// <param name="jsonName"></param>

    /// <param name="list"></param>

    /// <returns></returns>

    public static string ListToJson<T>(IList<T> list, string jsonName)

    {

        StringBuilder Json = new StringBuilder();

        if (string.IsNullOrEmpty(jsonName))

            jsonName = list[0].GetType().Name;

        Json.Append("{\"" + jsonName + "\":[");

        if (list.Count > 0)

        {

            for (int i = 0; i < list.Count; i++)

            {

                T obj = Activator.CreateInstance<T>();

                PropertyInfo[] pi = obj.GetType().GetProperties();

                Json.Append("{");

                for (int j = 0; j < pi.Length; j++)

                {

                    Type type = pi[j].GetValue(list[i], null).GetType();

                    Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(pi[j].GetValue(list[i], null).ToString(), type));

                    if (j < pi.Length - 1)

                    {

                        Json.Append(",");

                    }

                }

                Json.Append("}");

                if (i < list.Count - 1)

                {

                    Json.Append(",");

                }

            }

        }

        Json.Append("]}");

        return Json.ToString();

    }

    /// <summary>

    /// List转成json

    /// </summary>

    /// <typeparam name="T"></typeparam>

    /// <param name="list"></param>

    /// <returns></returns>

    public static string ListToJson<T>(IList<T> list)

    {

        object obj = list[0];

        return ListToJson<T>(list, obj.GetType().Name);

    }

    /// <summary>

    /// 对象转换为Json字符串

    /// </summary>

    /// <param name="jsonObject">对象</param>

    /// <returns>Json字符串</returns>

    public static string ToJson(object jsonObject)

    {

        try

        {

            StringBuilder jsonString = new StringBuilder();

            jsonString.Append("{");

            PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties();

            for (int i = 0; i < propertyInfo.Length; i++)

            {

                object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null);

                if (objectValue == null)

                {

                    continue;

                }

                StringBuilder value = new StringBuilder();

                if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan)

                {

                    value.Append("\"" + objectValue.ToString() + "\"");

                }

                else if (objectValue is string)

                {

                    value.Append("\"" + objectValue.ToString() + "\"");

                }

                else if (objectValue is IEnumerable)

                {

                    value.Append(ToJson((IEnumerable)objectValue));

                }

                else

                {

                    value.Append("\"" + objectValue.ToString() + "\"");

                }

                jsonString.Append("\"" + propertyInfo[i].Name + "\":" + value + ","); ;

            }

            return jsonString.ToString().TrimEnd(',') + "}";

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }

    /// <summary>

    /// 对象集合转换Json

    /// </summary>

    /// <param name="array">集合对象</param>

    /// <returns>Json字符串</returns>

    public static string ToJson(IEnumerable array)

    {

        string jsonString = "[";

        foreach (object item in array)

        {

            jsonString += ToJson(item) + ",";

        }

        jsonString.Remove(jsonString.Length - 1, jsonString.Length);

        return jsonString + "]";

    }

    /// <summary>

    /// 普通集合转换Json

    /// </summary>

    /// <param name="array">集合对象</param>

    /// <returns>Json字符串</returns>

    public static string ToArrayString(IEnumerable array)

    {

        string jsonString = "[";

        foreach (object item in array)

        {

            jsonString = ToJson(item.ToString()) + ",";

        }

        jsonString.Remove(jsonString.Length - 1, jsonString.Length);

        return jsonString + "]";

    }

    /// <summary>

    /// Datatable转换为Json

    /// </summary>

    /// <param name="table">Datatable对象</param>

    /// <returns>Json字符串</returns>

    public static string ToJson(DataTable dt)

    {

        StringBuilder jsonString = new StringBuilder();

        jsonString.Append("[");

        DataRowCollection drc = dt.Rows;

        for (int i = 0; i < drc.Count; i++)

        {

            jsonString.Append("{");

            for (int j = 0; j < dt.Columns.Count; j++)

            {

                string strKey = dt.Columns[j].ColumnName;

                string strValue = drc[i][j].ToString();

                Type type = dt.Columns[j].DataType;

                jsonString.Append("\"" + strKey + "\":");

                strValue = StringFormat(strValue, type);

                if (j < dt.Columns.Count - 1)

                {

                    jsonString.Append(strValue + ",");

                }

                else

                {

                    jsonString.Append(strValue);

                }

            }

            jsonString.Append("},");

        }

        jsonString.Remove(jsonString.Length - 1, 1);

        jsonString.Append("]");

        return jsonString.ToString();

    }

    /// <summary>

    /// DataTable转成Json

    /// </summary>

    /// <param name="jsonName"></param>

    /// <param name="dt"></param>

    /// <returns></returns>

    public static string ToJson(DataTable dt, string jsonName)

    {

        StringBuilder Json = new StringBuilder();

        if (string.IsNullOrEmpty(jsonName))

            jsonName = dt.TableName;

        Json.Append("{\"" + jsonName + "\":[");

        if (dt.Rows.Count > 0)

        {

            for (int i = 0; i < dt.Rows.Count; i++)

            {

                Json.Append("{");

                for (int j = 0; j < dt.Columns.Count; j++)

                {

                    Type type = dt.Rows[i][j].GetType();

                    Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j].ToString(), type));

                    if (j < dt.Columns.Count - 1)

                    {

                        Json.Append(",");

                    }

                }

                Json.Append("}");

                if (i < dt.Rows.Count - 1)

                {

                    Json.Append(",");

                }

            }

        }

        Json.Append("]}");

        return Json.ToString();

    }

    /// <summary>

    /// DataReader转换为Json

    /// </summary>

    /// <param name="dataReader">DataReader对象</param>

    /// <returns>Json字符串</returns>

    public static string ToJson(IDataReader dataReader)

    {

        StringBuilder jsonString = new StringBuilder();

        jsonString.Append("[");

        while (dataReader.Read())

        {

            jsonString.Append("{");

            for (int i = 0; i < dataReader.FieldCount; i++)

            {

                Type type = dataReader.GetFieldType(i);

                string strKey = dataReader.GetName(i);

                string strValue = dataReader[i].ToString();

                jsonString.Append("\"" + strKey + "\":");

                strValue = StringFormat(strValue, type);

                if (i < dataReader.FieldCount - 1)

                {

                    jsonString.Append(strValue + ",");

                }

                else

                {

                    jsonString.Append(strValue);

                }

            }

            jsonString.Append("},");

        }

        dataReader.Close();

        jsonString.Remove(jsonString.Length - 1, 1);

        jsonString.Append("]");

        if (jsonString.Length == 1)

        {

            return "[]";

        }

        return jsonString.ToString();

    }

    /// <summary>

    /// DataSet转换为Json

    /// </summary>

    /// <param name="dataSet">DataSet对象</param>

    /// <returns>Json字符串</returns>

    public static string ToJson(DataSet dataSet)

    {

        string jsonString = "{";

        foreach (DataTable table in dataSet.Tables)

        {

            jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";

        }

        jsonString = jsonString.TrimEnd(',');

        return jsonString + "}";

    }

    /// <summary>

    /// 过滤特殊字符

    /// </summary>

    /// <param name="s"></param>

    /// <returns></returns>

    private static string String2Json(String s)

    {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < s.Length; i++)

        {

            char c = s.ToCharArray()[i];

            switch (c)

            {

                case '\"':

                    sb.Append("\\\""); break;

                case '\\':

                    sb.Append("\\\\"); break;

                case '/':

                    sb.Append("\\/"); break;

                case '\b':

                    sb.Append("\\b"); break;

                case '\f':

                    sb.Append("\\f"); break;

                case '\n':

                    sb.Append("\\n"); break;

                case '\r':

                    sb.Append("\\r"); break;

                case '\t':

                    sb.Append("\\t"); break;

                default:

                    sb.Append(c); break;

            }

        }

        return sb.ToString();

    }

    /// <summary>

    /// 格式化字符型、日期型、布尔型

    /// </summary>

    /// <param name="str"></param>

    /// <param name="type"></param>

    /// <returns></returns>

    private static string StringFormat(string str, Type type)

    {

        if (type != typeof(string) && string.IsNullOrEmpty(str))

        {

            str = "\"" + str + "\"";

        }

        else if (type == typeof(string))

        {

            str = String2Json(str);

            str = "\"" + str + "\"";

        }

        else if (type == typeof(DateTime))

        {

            str = "\"" + str.Split(' ')[0] + "\"";

        }

        else if (type == typeof(bool))

        {

            str = str.ToLower();

        }

        return str;

    }

每天进步一点点...