zoukankan      html  css  js  c++  java
  • 转:datatable2json and model to json

    内容整理自博客园内园友的博客

    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

      把对象转换为字节序列的过程称为对象的序列化。

    把字节序列恢复为对象的过程称为对象的反序列化。

    在将Object序列化成JSON时普遍是使用以下几种方式:

    1. 第三方组件Newtonsoft.Json.dll来序列化。

    2. 直接用StringBuilder拼接字符串。

    3. .NET3.5中的DataContractJsonSerializer

    很多人使用的是第三方组件来序列化,但.NET3.5中已经提供了对序列化及反序列化很好的支持,直接使用就行了,而拼接字符串的方式就更原始了,要对一些字符串进行处理也容易出错。所以还是选择了DataContractJsonSerializer,感觉非常方便。下面就看怎么来实了:

    首先创建项目,添加必要的程序集引用:System.ServiceModel.WebSystem.Runtime.Serialization

    [Serializable]

    publicclass User{ public intUserId{get;set;}}

    当然把[Serializable]去掉,结果就正常了,可这样实体类就不能实例化了?当然我们可以用其它方法来解决这一问题,用WCF中的数据契约声明实体就行(别忘了在所有属性上加上[DataMember]不然这些属性都不可访问哦。)[DataContract]

    public class User

    {

         [DataMember]

         publicint UserId{get;set;}

    }

    这种方式可以用来实例化model类,而不适合来处理datatable

    List<User> users = new List<User>();

    Users.Add( new User{UserID=1;});

    string json = JsonHelper.Serialize(users);

    下面有一个类可以做基本的处理:

    代码
    public class JsonHelper
    {
    public static string String2Json(string s)
    {
    StringBuilder sb
    = new StringBuilder(s.Length + 20);

    var query
    = from c in s
    select c;

    sb.Append(
    '\"');

    foreach (char c in query)
    {
    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;
    }
    }

    sb.Append(
    '\"');

    return sb.ToString();
    }

    public static string Serialize<T>(T data)
    {
    System.Runtime.Serialization.Json.DataContractJsonSerializer serializer
    = new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());
    using (MemoryStream ms = new MemoryStream())
    {
    serializer.WriteObject(ms, data);
    return Encoding.UTF8.GetString(ms.ToArray());
    }
    }

    public static T Deserialize<T>(string json)
    {
    T obj
    = Activator.CreateInstance<T>();
    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
    {
    System.Runtime.Serialization.Json.DataContractJsonSerializer serializer
    = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
    return (T)serializer.ReadObject(ms);
    }
    }
    }


       
    private string DataTable2Json(DataTable dt)

        {
             StringBuilder jsonBuilder
    = new StringBuilder();
             jsonBuilder.Append(
    "{\"");
             jsonBuilder.Append(dt.TableName);
             jsonBuilder.Append(
    "\":[");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                 jsonBuilder.Append(
    "{");
                
    for (int j = 0; j < dt.Columns.Count; j++)
                {
                     jsonBuilder.Append(
    "\"");
                     jsonBuilder.Append(dt.Columns[j].ColumnName);
                     jsonBuilder.Append(
    "\":\"");
                     jsonBuilder.Append(dt.Rows[i][j].ToString());
                     jsonBuilder.Append(
    "\",");
                 }
                 jsonBuilder.Remove(jsonBuilder.Length
    - 1, 1);
                 jsonBuilder.Append(
    "},");
             }
             jsonBuilder.Remove(jsonBuilder.Length
    - 1, 1);
             jsonBuilder.Append(
    "]");
             jsonBuilder.Append(
    "}");
            
    return jsonBuilder.ToString();
         }

     


     

  • 相关阅读:
    2018左其盛差评榜(截至10月31日)
    4星|《环球科学》2018年10月号:习惯悬崖上生活的游隼现在开心地在摩天大楼上捕食鸽子
    4星|《财经》2018年第25期:中国的五大主要城市群具备“大、快、活”三个独特优势
    2018左其盛好书榜(截至10月31日)
    4星|《门口的野蛮人1》:1988年惊动美国的一次杠杆收购事件
    在 ASP.NET Core 具体使用文档
    .Net Core 部署到 CentOS7 64 位系统中的步骤
    [Linux/Ubuntu] vi/vim 使用方法讲解
    CentOS7使用httpd apache 和firewalld打开关闭防火墙与端口
    Linux软件管理器(如何使用软件管理器来管理软件)2---安装及管理Linux应用程序
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/1813986.html
Copyright © 2011-2022 走看看