最近实现一种将数据表转为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]
下面是上述DataTable转JSON的C#代码:
-
usingSystem; 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 = newJavaScriptSerializer(); /// <summary> /// DataTable 转换成 JSON string。 /// </summary> /// <param name="dt">需要转换的DataTable</param> /// <returns>JSON结构字符串</returns> public static stringFromDataTable(System.Data.DataTabledt) { StringBuilder sb = newStringBuilder(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.DataTabledt, StringBuildersb) { 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("]}"); } }