将数据表DataTable转为压缩JSON格式

最近实现一种将数据表转为JSON表示的新方法。
这种方法表示的JSON数据更省空间(尤其是网络传输,能省很多数据量),使用起来也很方便。
假设有这样一张数据表:
ID Name Location
1 周杰伦 香港
2 侯佩岑 台湾
3 张靓颖 大陆

一般的JSON表示方法为:

[
  {"ID":1, "Name": "周杰伦", "Location": "香港"},
  {"ID":2, "Name": "侯佩岑", "Location": "台湾"},
  {"ID":3, "Name": "张靓颖", "Location": "大陆"}
]

可以看到,数据表的字段信息(column)在每条记录里都写了一遍,比较浪费空间。如果字段很多很长,甚至会比有效内容更多。随着记录数增加,浪费的数据量是很可观的。尤其像以前小百合BBS自己付流量费的时候,流量啊流量。。。。。。

我实现的表示方法产生的JSON格式是这样的:

{
  "C":{"ID":0, "Name":1, "Location":2},
  "D":[
    [1, "周杰伦", "香港"],
    [2, "侯佩岑", "台湾"],
    [3, "张靓颖", "大陆"]
  ]
}

这种方法将字段信息单独提取到C属性里,而D属性是纯粹的记录数据。
其实D属性本身已经完全能表示记录内容,C属性只是为了使用时方便。
在这短短几个字段及几条数据的极端情况下,已经省下几十字节。

下面对比使用方法,我承认这种方法稍微比通用的方法复杂一点,但是带来的节省,个人认为还是值得的:
通用方法取周杰伦:[0].Name 我的方法取周杰伦:D[0][C.Name]

通用方法取周杰伦:[0].Name
我的方法取周杰伦:D[0][C.Name]

下面是上述DataTable转JSON的C#代码:

using System;
using System.Text;
using System.Web.Script.Serialization;
/// <summary>
/// 一种JSON表示DataTable的新方法
/// <see href="http://bianbian.org/technology/javascript/361.html" />
/// </summary>
public static class JsonUtil
{
    static JavaScriptSerializer _jss = new JavaScriptSerializer();

    /// <summary>
    /// DataTable 转换成 JSON string。
    /// </summary>
    /// <param name="dt">需要转换的DataTable</param>
    /// <returns>JSON结构字符串</returns>
    public static string FromDataTable(System.Data.DataTable dt)
    {
        StringBuilder sb = new StringBuilder(256);
        FormDataTable(dt, sb);
        return sb.ToString();
    }

    /// <summary>
    /// DataTable 转换成 JSON string。
    /// </summary>
    /// <param name="dt">需要转换的DataTable</param>
    /// <param name="sb">StringBuilder</param>
    public static void FormDataTable(System.Data.DataTable dt, StringBuilder sb)
    {
        sb.Append("{C:{");
        // -> {"ID":0, "Name":1}
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            if (j > 0)
                sb.Append(',');
            sb.Append('"').Append(dt.Columns[j].ColumnName).Append('"')
                .Append(':').Append(j);
        }
        sb.Append("},D:[");

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            if (i > 0)
                sb.Append(',');
            sb.Append('[');
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                if (j > 0)
                    sb.Append(',');
                _jss.Serialize(dt.Rows[i][j], sb);
            }
            sb.Append(']');
        }
        sb.Append("]}");
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值