ASP.NET中实现JSON和对象及集合之间互转,附JsonHelper辅助操作类

来源:互联网 发布:成都网络外包公司 编辑:程序博客网 时间:2024/04/30 02:22
WebService只能返回字符串,所以我们选择了轻量级的JSON,为了简化操作,我们希望能在调用的地方能将JSON转化成相应的实体或IList集合,于是我们做了一个JsonHelper操作JSON和实体以及列表之间相互转换的辅助类。

JSON辅助操作类(JSON和Object、JSON和IList、JSON和IPagedList之间相互转换)


using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.Runtime.Serialization.Json;using System.Text.RegularExpressions;using System.IO; /// <summary>/// JSON操作辅助类/// </summary>public class JsonHelper{    /// <summary>    /// 将JSON转化成IPagedList集合    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="json">JSON字符串</param>    /// <returns>IPagedList集合</returns>    public static IPagedList<T> JsonToPagedList<T>(string json)    {        if (json == "")            return default(IPagedList<T>);         //获取特定字段的索引,根据索引取到相应的值        int startPageIndex = json.IndexOf("\"PageIndex\":");        int startPageSize = json.IndexOf("\"PageSize\":");        int startTotalCount = json.IndexOf("\"TotalCount\":");        int startPageList = json.IndexOf("\"PageList\":");         int pageIndex = Convert.ToInt32(json.Substring(startPageIndex + 12, startPageSize - startPageIndex - 13));        int pageSize = Convert.ToInt32(json.Substring(startPageSize + 11, startTotalCount - startPageSize - 12));        int totalCount = Convert.ToInt32(json.Substring(startTotalCount + 13, startPageList - startTotalCount - 14));         //取出列表部分的JSON        var newJson = json.Replace("}]}]", "}]");        newJson = newJson.Substring(startPageList + 11);         var entitys = JsonToList<T>(newJson);         return new PagedList<T>(entitys, pageIndex, pageSize, totalCount);    }     /// <summary>    /// 将JSON转化成IList集合    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="json">JSON字符串</param>    /// <returns>IList集合</returns>    public static IList<T> JsonToList<T>(string json)    {        if (json == "")            return default(IList<T>);         var newJson = json.Replace("}]", "");        newJson = newJson.Substring(newJson.IndexOf("[{") + 2);        var regex = new Regex("},{");        var jsons = regex.Split(newJson);         var entitys = new List<T>();         foreach (var item in jsons)        {            var temp = "{" + item + "}";            entitys.Add(JsonToObject<T>(temp));        }        return entitys;    }     /// <summary>    /// 将JSON转化成Object单个实体    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="json">JSON字符串</param>    /// <returns>Object实体</returns>    public static T JsonToObject<T>(string json)    {        if (json == "")            return default(T);         var ser = new DataContractJsonSerializer(typeof(T));        var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));        var jsonObject = (T)ser.ReadObject(ms);        ms.Close();        return jsonObject;    }      /// <summary>    /// 分页集合转化成JSON    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="pagedList">分页实体集合</param>    /// <returns>JSON字符串</returns>    public static string ObjectPagedListToJson<T>(IPagedList<T> pagedList)    {        if (pagedList == null || pagedList.Count == 0)            return "";         var sb = new StringBuilder();        sb.Append("[{\"PageIndex\":");        sb.Append(pagedList.PageIndex);        sb.Append(",\"PageSize\":");        sb.Append(pagedList.PageSize);        sb.Append(",\"TotalCount\":");        sb.Append(pagedList.TotalCount);        sb.Append(",\"PageList\":");         sb.Append(ObjectListToJson<T>(pagedList));        sb.Append("}]");         return sb.ToString();    }      /// <summary>    /// List集合转化成JSON    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="list">实体集合</param>    /// <returns>JSON字符串</returns>    public static string ObjectListToJson<T>(IList<T> list)    {        if (list == null || list.Count == 0)            return "";         var sb = new StringBuilder();        sb.Append("[");         for (var i = 0; i < list.Count; i++)        {            var item = list[i];            if (i > 0)            {                sb.Append(",");            }            sb.Append(ObjectToJson(item));        }         sb.Append("]");         return sb.ToString();    }     /// <summary>    /// 对象转化成JSON    /// </summary>    /// <param name="obj">实体或实体集合</param>    /// <returns>JSON字符串</returns>    public static string ObjectToJson(object obj)    {        if (obj == null)            return "";         var ser = new DataContractJsonSerializer(obj.GetType());        using (var ms = new MemoryStream())        {            ser.WriteObject(ms, obj);            var sb = new StringBuilder();            sb.Append(Encoding.UTF8.GetString(ms.ToArray()));            return sb.ToString();        }    }}

关于如何使用

WebService定义函数

[WebMethod]public string GetUserById(int id){    var user = _userService.GetById(id);    return JsonHelper.ObjectToJson(user);}

调用WebService并将JSON转换

[WebMethod]WebServiceSoapClient webServiceClient = new WebServiceSoapClient();string jsonUser = webServiceClient.GetUserById(userId);var _user = JsonHelper.JsonToObject<User>(jsonUser);

这里以实体User为例来做演示,WebService和调用的程序两边都要定义User类,并保持一致即可,其他调用也都一样调用,需要说明的是IPagedList这个是我自定义的类,详情可参考:ASP.NET通过扩展IPagedList接口 读取带有分页信息的集合

0 0
原创粉丝点击