轻量的Json序列化
2011-10-01 08:01
211 查看
framework里提供了DataContractJsonSerializer这样一个类,可以实现对象与json间的序列化和反序列化,可参考博文 /article/6629992.html。而为了方便,本人做了一个扩展方法,可以将任意的object序列化为json,不提供反序列化。
这是一个很简单的扩展方法,代码如下:
/// <summary>
/// 将对象序列化为 Json 文本流。
/// </summary>
/// <param name="source">要转换的对象。</param>
/// <param name="inclusive">选择要包含的属性数组。</param>
/// <param name="exclusive">选择要排除的属性数组。</param>
/// <returns></returns>
public static string ToJson(this object source, string[] inclusive = null, string[] exclusive = null)
{
if (source == null)
{
return "null";
}
var type = source.GetType();
switch (Type.GetTypeCode(type))
{
//数值型
case TypeCode.Byte:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.SByte:
case TypeCode.Single:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
return source.ToString();
case TypeCode.Object:
break;
case TypeCode.Boolean:
return (bool)source ? "true" : "false";
case TypeCode.DBNull:
return "null";
default:
return "\"" + source + "\"";
}
var sb = new StringBuilder();
var flag = new AssertFlag(true);
//DataSet
if (source is DataSet)
{
var ds = source as DataSet;
sb.Append("[ ");
foreach (var table in ds.Tables)
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(table.ToJson());
}
sb.Append(" ]");
}
//DataTable
else if (source is DataTable)
{
var tb = source as DataTable;
sb.Append("[ ");
foreach (var row in tb.Rows)
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(row.ToJson());
}
sb.Append(" ]");
}
//DataRow
else if (source is DataRow)
{
var row = source as DataRow;
sb.Append("{");
foreach (DataColumn column in row.Table.Columns)
{
if (PropertyNotToJson(column.ColumnName, inclusive, exclusive))
{
continue;
}
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.AppendFormat("\"{0}\" : {1}", column.ColumnName, row[column].ToJson());
}
sb.Append("}");
}
//Array
else if (type.IsArray)
{
var array = source as Array;
sb.Append("[ ");
for (var i = 0; i < array.Length; i++)
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(array.GetValue(i).ToJson());
}
sb.Append(" ]");
}
//IEnumerable
else if (source is IEnumerable)
{
var enu = (source as IEnumerable).GetEnumerator();
sb.Append("[ ");
while (enu.MoveNext())
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(enu.Current.ToJson());
}
sb.Append(" ]");
}
else if (type != typeof(object))
{
sb.Append("{");
var pps = from s in type.GetProperties(BindingFlags.Public | BindingFlags.Instance) where s.CanRead select s;
foreach (var pro in pps)
{
if (PropertyNotToJson(pro.Name, inclusive, exclusive))
{
continue;
}
var value = pro.GetValue(source, null);
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.AppendFormat("\"{0}\" : {1}", pro.Name, value.ToJson());
}
sb.Append("}");
}
return sb.ToString();
}
/// <summary>
/// 属性不被序列化。
/// </summary>
/// <param name="propertyName">属性名称。</param>
/// <param name="inclusive">选择要包含的属性数组。</param>
/// <param name="exclusive">选择要排除的属性数组。</param>
/// <returns></returns>
private static bool PropertyNotToJson(string propertyName, IEnumerable<string> inclusive = null, IEnumerable<string> exclusive = null)
{
return ((inclusive != null && !inclusive.Contains(propertyName)) ||
(exclusive != null && exclusive.Contains(propertyName)));
}
这是一个很简单的扩展方法,代码如下:
/// <summary>
/// 将对象序列化为 Json 文本流。
/// </summary>
/// <param name="source">要转换的对象。</param>
/// <param name="inclusive">选择要包含的属性数组。</param>
/// <param name="exclusive">选择要排除的属性数组。</param>
/// <returns></returns>
public static string ToJson(this object source, string[] inclusive = null, string[] exclusive = null)
{
if (source == null)
{
return "null";
}
var type = source.GetType();
switch (Type.GetTypeCode(type))
{
//数值型
case TypeCode.Byte:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.SByte:
case TypeCode.Single:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
return source.ToString();
case TypeCode.Object:
break;
case TypeCode.Boolean:
return (bool)source ? "true" : "false";
case TypeCode.DBNull:
return "null";
default:
return "\"" + source + "\"";
}
var sb = new StringBuilder();
var flag = new AssertFlag(true);
//DataSet
if (source is DataSet)
{
var ds = source as DataSet;
sb.Append("[ ");
foreach (var table in ds.Tables)
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(table.ToJson());
}
sb.Append(" ]");
}
//DataTable
else if (source is DataTable)
{
var tb = source as DataTable;
sb.Append("[ ");
foreach (var row in tb.Rows)
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(row.ToJson());
}
sb.Append(" ]");
}
//DataRow
else if (source is DataRow)
{
var row = source as DataRow;
sb.Append("{");
foreach (DataColumn column in row.Table.Columns)
{
if (PropertyNotToJson(column.ColumnName, inclusive, exclusive))
{
continue;
}
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.AppendFormat("\"{0}\" : {1}", column.ColumnName, row[column].ToJson());
}
sb.Append("}");
}
//Array
else if (type.IsArray)
{
var array = source as Array;
sb.Append("[ ");
for (var i = 0; i < array.Length; i++)
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(array.GetValue(i).ToJson());
}
sb.Append(" ]");
}
//IEnumerable
else if (source is IEnumerable)
{
var enu = (source as IEnumerable).GetEnumerator();
sb.Append("[ ");
while (enu.MoveNext())
{
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.Append(enu.Current.ToJson());
}
sb.Append(" ]");
}
else if (type != typeof(object))
{
sb.Append("{");
var pps = from s in type.GetProperties(BindingFlags.Public | BindingFlags.Instance) where s.CanRead select s;
foreach (var pro in pps)
{
if (PropertyNotToJson(pro.Name, inclusive, exclusive))
{
continue;
}
var value = pro.GetValue(source, null);
if (!flag.AssertTrue())
{
sb.Append(", ");
}
sb.AppendFormat("\"{0}\" : {1}", pro.Name, value.ToJson());
}
sb.Append("}");
}
return sb.ToString();
}
/// <summary>
/// 属性不被序列化。
/// </summary>
/// <param name="propertyName">属性名称。</param>
/// <param name="inclusive">选择要包含的属性数组。</param>
/// <param name="exclusive">选择要排除的属性数组。</param>
/// <returns></returns>
private static bool PropertyNotToJson(string propertyName, IEnumerable<string> inclusive = null, IEnumerable<string> exclusive = null)
{
return ((inclusive != null && !inclusive.Contains(propertyName)) ||
(exclusive != null && exclusive.Contains(propertyName)));
}
相关文章推荐
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
- 将Jquery序列化后的表单值转换成Json
- C#:Json数据反序列化为Dictionary并根据关键字获取指定的值
- JSON & JavaScriptSerializer序列化
- 使用JavaScriptSerializer进行JSON序列化
- jackson 实体转json 为NULL或者为空不参加序列化
- JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象
- json2.js 序列化 和反序列化 转
- 在ASP.net 3.5中 用JSON序列化对象(两种方法)
- 【json】使用json和java对象的序列化和反序列化
- Java中的JSON序列化和反序列化 和Vo的转换
- jQuery 将表单序列化为Json对象
- Jquery getJSON() 序列化类以及集合(转)
- Python之数据序列化(json、pickle、shelve)
- json序列化hibernate级联映射POJO
- 【转】Newtonsoft.Json 的序列化与反序列化
- python整理二十四——让simplejson支持datetime类型的序列化
- DataTable序列化为JSON字符串
- Form表单序列化成JSON
- fastjson生成和解析json数据,序列化和反序列化数据