using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Objects.DataClasses;
using System.Text;
using System.Reflection;
using System.Collections;
namespace Entity.Utity
{
public static class EntityToJSON
{
#region 实体扩展方法
/// <summary>
/// 转换实体信息为Json
/// </summary>
/// <param name="obj">实体对象</param>
/// <returns></returns>
public static String ToEntitiesJson(this EntityObject obj)
{
return new EntitiesTools().EntitiesToJson(obj, "");
}
/// <summary>
/// 转换实体信息为Json
/// </summary>
/// <param name="obj">实体对象</param>
/// <param name="Include">获取子对象:使用,号分开</param>
/// <returns></returns>
public static String ToEntitiesJson(this EntityObject obj, String Include)
{
return new EntitiesTools().EntitiesToJson(obj, Include);
}
/// <summary>
/// 转换实体信息为Json
/// </summary>
/// <param name="obj">实体对象</param>
/// <returns></returns>
public static String ToEntitiesJson(this IQueryable obj)
{
return new EntitiesTools().EntitiesToJson(obj, "");
}
/// <summary>
/// 转换实体信息为Json
/// </summary>
/// <param name="obj">实体对象</param>
/// <param name="Include">获取子对象:使用,号分开</param>
/// <returns></returns>
public static String ToEntitiesJson(this IQueryable obj, String Include)
{
return new EntitiesTools().EntitiesToJson(obj, Include);
}
/// <summary>
/// 转换实体信息为Json
/// </summary>
/// <param name="obj">实体对象</param>
/// <param name="Include">获取子对象:使用,号分开</param>
/// <returns></returns>
public static String ToEntitiesJson(this IList obj, String Include)
{
return new EntitiesTools().EntitiesToJson(obj, Include);
}
#endregion
}
#region 转换实体信息为Json
/// <summary>
/// 转换实体信息为Json
/// </summary>
public class EntitiesTools
{
#region 转换实体信息为Json
/// <summary>
/// 转换实体信息为Json
/// </summary>
/// <param name="obj">实体对象</param>
/// <param name="Include">获取子对象:使用,号分开</param>
/// <returns></returns>
public String EntitiesToJson(Object obj, String Include)
{
Type type = obj.GetType();
String sJosnString = "";
StringBuilder TempStringJson = new StringBuilder();
StringBuilder json = new StringBuilder();
switch (type.Name)
{
case "ObjectQuery`1":
TempStringJson.Clear();
json.Append("[");
foreach (Object _obj in obj as IQueryable)
{
TempStringJson.Append(EntitiesToJson(_obj, Include, 0));
TempStringJson.Append(",");
}
sJosnString = TempStringJson.ToString();
json.Append(sJosnString.Substring(0, sJosnString.Length - 1));
json.Append("]");
break;
case "List`1":
TempStringJson.Clear();
json.Append("[");
foreach (Object _obj in obj as IList)
{
TempStringJson.Append(EntitiesToJson(_obj, Include, 0));
TempStringJson.Append(",");
}
sJosnString = TempStringJson.ToString();
json.Append(sJosnString.Substring(0, sJosnString.Length - 1));
json.Append("]");
break;
default:
json.Append(EntitiesToJson(obj, Include, 0));
break;
}
return json.ToString().Replace('/','\"');//将“/"转换成双引号
}
/// <summary>
/// 转换实体信息为Json
/// </summary>
/// <param name="obj">实体对象</param>
/// <param name="Include">获取子对象:使用,号分开</param>
/// <param name="Level">当前递归的层级</param>
/// <returns></returns>
private String EntitiesToJson(Object obj, String Include, int Level)
{
if (obj == null) { return null; }
StringBuilder TempStringJson = new StringBuilder();
List<String> IncludeA = Include.Split(',').ToList<String>();
//需要排除的属性类型
List<String> ignoreEntityTypes = new List<String> { "EntityReference`1", "EntityState", "EntityKey", "EntitySetName" };
//实体集合
List<String> ListType = new List<String> { "EntityCollection`1" };
//数据类型(非实体集合类型)
List<String> EntitesType = new List<String> { "Binary", "Boolean", "DateTime", "DateTimeOffset", "Decimal", "Double", "Guid", "Int16", "Int32", "Int64", "Single", "String", "Time" };
//未支持的数据类型
List<String> NotType = new List<String> { "Byte", "SByte" };
StringBuilder json = new StringBuilder();
json.Append("{");
Type type = obj.GetType();
PropertyInfo[] propertyInfoList = type.GetProperties();
string doubleQuote = "/";
#region 迭代属性
foreach (PropertyInfo _PropertyInfo in propertyInfoList)
{
#region 排除类型
if (ignoreEntityTypes.Contains(_PropertyInfo.PropertyType.Name))
{
continue;
}
#endregion
var propertyName = _PropertyInfo.Name;
var propertyType = _PropertyInfo.PropertyType;
var propertyValue = _PropertyInfo.GetValue(obj, null);
try
{
#region 值=null
if (propertyValue == null)
{
json.Append(doubleQuote + propertyName + doubleQuote +
":" + "null");
json.Append(",");
continue;
}
#endregion
#region 非实体集合类型
if (EntitesType.Contains(propertyValue.GetType().Name))
{
try
{
TempStringJson.Clear();
TempStringJson.Append(doubleQuote + propertyName + doubleQuote +
":" + StringFormat(propertyValue, propertyType));
TempStringJson.Append(",");
json.Append(TempStringJson);
continue;
}
catch (Exception Err)
{
throw Err;
}
}
#endregion
#region 非Include对象
if (!IncludeA.Contains(propertyName))
{
json.Append(doubleQuote + propertyName + doubleQuote +
":" + "null");
json.Append(",");
continue;
}
#endregion
#region 实体集合类型
if (ListType.Contains(propertyValue.GetType().Name) && Level == 0)
{
try
{
TempStringJson.Clear();
bool IsNull = true;
//用来判断集合是否为空,待改善的方法
foreach (Object p in (IRelatedEnd)propertyValue)
{
IsNull = false;
break;
}
if (IsNull)
{
TempStringJson.Append(doubleQuote + propertyName + doubleQuote +
":" + "null");
TempStringJson.Append(",");
continue;
}
StringBuilder ListJosnString = new StringBuilder();
json.Append(doubleQuote + propertyName + doubleQuote + ":[");
foreach (Object p in (IRelatedEnd)propertyValue)
{
String Child = EntitiesToJson(p, Include, 1);
ListJosnString.Append(Child);
ListJosnString.Append(",");
}
String sListJosnString = ListJosnString.ToString();
TempStringJson.Append(sListJosnString.Substring(0, sListJosnString.Length - 1));
TempStringJson.Append("]");
TempStringJson.Append(",");
json.Append(TempStringJson);
continue;
}
catch (Exception Err)
{
throw Err;
}
}
#endregion
#region 其他类型[应该只剩下实体对象了],有可能有没有考虑到的情况!
try
{
TempStringJson.Clear();
TempStringJson.Append(doubleQuote + propertyName + doubleQuote +
":" + EntitiesToJson(propertyValue, Include, 1));
TempStringJson.Append(",");
json.Append(TempStringJson);
continue;
}
catch (Exception Err)
{
throw Err;
}
#endregion
}
catch (Exception Err)
{
json.Append(doubleQuote + propertyName + doubleQuote +
":" + "null");
json.Append(",");
continue;
}
}
#endregion
String sJosnString = json.ToString();
return sJosnString.Substring(0, sJosnString.Length - 1) + "}";
}
/// <summary>
/// 将datetime转换成js格式
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
private double UnixTicks(DateTime dt)
{
DateTime d1 = new DateTime(1970, 1, 1);
DateTime d2 = dt.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return ts.TotalMilliseconds;
}
private string StringFormat(object val, Type type)
{
string str = val.ToString();
if (type == typeof(string))
{
// str = String2Json(str);
str = "/" + str + "/";
}
else if (type == typeof(DateTime) || Nullable.GetUnderlyingType(type) == typeof(DateTime))
{
//str = Convert.ToString(UnixTicks(Convert.ToDateTime(val)));
//str="\\/Date("+str+")\\/";
str = "/" + str + "/";
}
else if (type == typeof(bool))
{
str = str.ToLower();
}
return str;
}
}
}
#endregion
#endregion;
联系客服