C#中Json数据转换

C#编程,Json数据转换。VS2013,.net4.5,win7平台开发。

下面是一个Json数据转换的工具类。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Web.Script.Serialization;

namespace JR_Common
{
    /// <summary>
    /// JSON转换工具类
    /// </summary>
    public class JSONHelper
    {

        /// <summary>
        /// <para>方法说明:</para>
        /// <para>--> 将一个可序列化对象转为json字符串</para>
        /// <para>--> 在调用该方法时须指明传入参数t的参数类型</para>
        /// <para>参数:</para>
        /// <para>--> t:需要转换的对象</para>
        /// <para>--> encoding:编码方式,一般用UTF-8</para>
        /// <para>返回值:</para>
        /// <para>--> json字符串</para>
        /// <para>注:该方法只能用于可序列化对象(如:List)的转换;而字典对象(如:Dictionary)不能使用该方法转换</para>
        /// </summary>
        public static string ObjectToJson<T>(T t, Encoding encoding)
        {
            string jsonString = null;

            DataContractJsonSerializer serializer = null;
            MemoryStream ms = null;
            try
            {
                ms = new MemoryStream();
                serializer = new DataContractJsonSerializer(typeof(T));
                serializer.WriteObject(ms, t);
                jsonString = encoding.GetString(ms.ToArray());
            }
            catch (Exception ex)
            {
                jsonString = null;
                throw ex;
            }
            finally
            {
                ms.Close();
                ms.Dispose();
            }

            return jsonString;
        }


        /// <summary>
        /// <para>方法说明:</para>
        /// <para>--> 从json字符串中反转出一个可序列化对象</para>
        /// <para>--> 在调用该方法时须指明要转化成某一对象的对象类型</para>
        /// <para>参数:</para>
        /// <para>--> jsonStr:json格式的字符串</para>
        /// <para>--> encoding:编码方式,一般用UTF-8</para>
        /// <para>返回值:</para>
        /// <para>--> json字符串</para>
        /// <para>注:该方法只能用于可序列化对象(如:List)的转换;而字典对象(如:Dictionary)不能使用该方法转换</para>
        /// </summary>
        public static T JsonToObject<T>(string json, Encoding encoding)
        {
            T obj = default(T);

            MemoryStream ms = null;
            DataContractJsonSerializer ser = null;
            try
            {
                ms = new MemoryStream(encoding.GetBytes(json));
                ser = new DataContractJsonSerializer(typeof(T));
                obj = (T)ser.ReadObject(ms);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ms.Close();
                ms.Dispose();
            }

            return obj;
        }


        /// <summary>
        /// <para>方法说明:</para>
        /// <para>--> 将一个DataTable对象转成json字符串</para>
        /// <para>参数:</para>
        /// <para>--> dt:一个非空且有数据的DataTable对象</para>
        /// <para>返回值:</para>
        /// <para>--> json字符串</para>
        /// </summary>
        public static string DataTableToJson(DataTable dt)
        {
            var JsonString = new StringBuilder();
            if (dt != null && dt.Rows.Count > 0)
            {
                JsonString.Append("[");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    JsonString.Append("{");
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        if (j < dt.Columns.Count - 1)
                        {
                            JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\",");
                        }
                        else if (j == dt.Columns.Count - 1)
                        {
                            JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\"");
                        }
                    }
                    if (i == dt.Rows.Count - 1)
                    {
                        JsonString.Append("}");
                    }
                    else
                    {
                        JsonString.Append("},");
                    }
                }
                JsonString.Append("]");
            }
            return JsonString.ToString();
        }


        /// <summary>
        /// <para>方法说明:</para>
        /// <para>--> 把json字符串转成DataTable对象</para>
        /// <para>参数:</para>
        /// <para>--> json:一个规则的json字符串</para>
        /// <para>返回值:</para>
        /// <para>--> DataTable对象</para>
        /// </summary>
        public static DataTable JsonToDataTable(string json)
        {
            DataTable dataTable = new DataTable();  //实例化  
            DataTable result;
            try
            {
                JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
                javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值  
                ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
                if (arrayList.Count > 0)
                {
                    foreach (Dictionary<string, object> dictionary in arrayList)
                    {
                        if (dictionary.Keys.Count == 0)
                        {
                            result = dataTable;
                            return result;
                        }
                        if (dataTable.Columns.Count == 0)
                        {
                            foreach (string current in dictionary.Keys)
                            {
                                dataTable.Columns.Add(current, dictionary[current].GetType());
                            }
                        }
                        DataRow dataRow = dataTable.NewRow();
                        foreach (string current in dictionary.Keys)
                        {
                            dataRow[current] = dictionary[current];
                        }

                        dataTable.Rows.Add(dataRow); //循环添加行到DataTable中  
                    }
                }
            }
            catch
            {
            }
            result = dataTable;
            return result;
        }




    }
}

以上的 DataTableToJson 方法存在不严谨的地方。下面是优化后的结果。

	#region DataTable数据数据对象转Json字符串

        /// <summary>
        /// <para>方法说明:</para>
        /// <para>--> 将一个DataTable对象转成json字符串</para>
        /// <para>参数:</para>
        /// <para>--> dt:一个非空且有数据的DataTable对象</para>
        /// <para>返回值:</para>
        /// <para>--> json字符串</para>
        /// </summary>
        public static string DataTableToJson(DataTable dt)
        {
            StringBuilder json = new StringBuilder();

            //json.Append("{[");
            json.Append("[");
            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("]}");
            json.Append("]");

            return json.ToString();
        }

        /// <summary>
        /// 格式化字符型、日期型、布尔型
        /// </summary>
        private static string StringFormat(string str, Type type)
        {
            if (type == typeof(string))
            {
                str = StringToJson(str);
                str = "\"" + str + "\"";
            }
            else if (type == typeof(DateTime))
            {
                str = "\"" + str + "\"";
            }
            else if (type == typeof(bool))
            {
                str = str.ToLower();
            }
            else if (type != typeof(string) && string.IsNullOrEmpty(str))
            {
                str = "\"" + str + "\"";
            }
            return str;
        }

        /// <summary>
        /// 过滤特殊字符
        /// </summary>
        private static string StringToJson(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();
        }


        #endregion
希望给你带来帮助!!!谢谢大家。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值