WebService只能返回字符串,所以我们选择了轻量级的JSON,为了简化操作,我们希望能在调用的地方能将JSON转化成相应的实体或IList集合,于是我们做了一个JsonHelper操作JSON和实体以及列表之间相互转换的辅助类。
调用WebService并将JSON转换
这里以实体User为例来做演示,WebService和调用的程序两边都要定义User类,并保持一致即可,其他调用也都一样调用,需要说明的是IPagedList这个是我自定义的类,详情可参考: ASP.NET通过扩展IPagedList接口 读取带有分页信息的集合
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接口 读取带有分页信息的集合