C# Winform反序列化复杂json字符串
2015-07-04 10:43
627 查看
最近接的私单是一个CS项目,里面所有的操作都是通过调用API接口来进行的。
提交json 数据包
返回说明
正确时返回JSON数据包:
错误时返回JSON数据包:
根据这个返回的json字符串,我们来构建相应的类FoodList,为后面将json反序列化为FoodList做准备
那么,我需要做的,就是调用API接口,拿到json字符串,然后反序列化为对象。
C#中序列化和反序列化有多中方式,这里我采用JavaScriptSerializer,在Winform程序中使用JavaScriptSerializer需要先添加如下两个引用:
View Code
调用方式:
接口详细说明
协议:https 请求方式:post https://xx.xxx.net/app/clients提交json 数据包
{ "action":" food_t_list", "data":{ “pageIndex”:”1”, “pageSize”:”20”, “foodGId”:”1”, “storeId”:”1” } }
返回说明
正确时返回JSON数据包:
{ "result": "1", "data": { "totalCount": "20", "pageCount": "3", “storeId”:”1”, "foodTables": [ { "foodTId": "2", "foodTName": "8号台", “foodTPeo”:”6”, “foodGrade”: {“foodGId”:”1”,”foodGName”:”大厅”}, “foodTStatus”:”1”, "foodTDesc ": "餐桌的描述", “storeId”:”1” }, { "foodTId": "5", "foodTName": "5号台", “foodTPeo”:”8”, “foodGrade”: {“foodGId”:”2”,”foodGName”:”包间”}, “foodTStatus”:”0”, "foodTDesc ": "餐桌的描述" } ] } }
错误时返回JSON数据包:
{“result”:”0”,"errcode":10036”,”errmsg":"错误信息!"} //错误代码,根据代码规则查询错误信息。
根据这个返回的json字符串,我们来构建相应的类FoodList,为后面将json反序列化为FoodList做准备
public abstract class BaseEntity { public int result { get; set; } public int errcode { get; set; } public string errmsg { get; set; } } /// <summary> /// 餐桌列表 /// </summary> public class FoodList : BaseEntity { public FoodEntity data { get; set; } } public class FoodEntity { /// <summary> /// 总页数 /// </summary> public int totalCount { get; set; } /// <summary> /// 当前页数 /// </summary> public int pageCount { get; set; } /// <summary> /// 餐桌等级列表集合 /// </summary> public List<FoodTable> foodTables { get; set; } } public class FoodTable { /// <summary> /// 餐桌 ID /// </summary> public int foodTId { get; set; } /// <summary> /// 餐桌名称 /// </summary> public string foodTName { get; set; } /// <summary> /// 餐桌使用人数 /// </summary> public int foodTPeo { get; set; } /// <summary> /// 餐桌等级 /// </summary> public FoodGradeInfo foodGrade { get; set; } /// <summary> /// 餐桌状态 0 空闲 1 预定 2 使用中 /// </summary> public int? foodTStatus { get; set; } /// <summary> /// 餐桌的描述 /// </summary> public string foodTDesc { get; set; } /// <summary> /// 商铺 ID /// </summary> public int storeId { get; set; } }
那么,我需要做的,就是调用API接口,拿到json字符串,然后反序列化为对象。
C#中序列化和反序列化有多中方式,这里我采用JavaScriptSerializer,在Winform程序中使用JavaScriptSerializer需要先添加如下两个引用:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; using System.IO; using Newtonsoft.Json.Converters; namespace BarCounter.Util { /// <summary> ///JsonUtility 的摘要说明 /// </summary> public class Utility { /// <summary> /// Json工具类 /// </summary> public static class JsonUtility { /// <summary> /// 添加时间转换器 /// </summary> /// <param name="serializer"></param> private static void AddIsoDateTimeConverter(JsonSerializer serializer) { IsoDateTimeConverter idtc = new IsoDateTimeConverter(); //定义时间转化格式 idtc.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; //idtc.DateTimeFormat = "yyyy-MM-dd"; serializer.Converters.Add(idtc); } /// <summary> /// Json转换配置 /// </summary> /// <param name="serializer"></param> private static void SerializerSetting(JsonSerializer serializer) { serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //serializer.NullValueHandling = NullValueHandling.Ignore; //serializer.MissingMemberHandling = MissingMemberHandling.Ignore; //serializer.DefaultValueHandling = DefaultValueHandling.Ignore; } /// <summary> /// 返回结果消息编码 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sucess"></param> /// <param name="message"></param> /// <param name="exMessage"></param> /// <param name="data"></param> /// <returns></returns> public static string ReturnMessage(bool sucess, int total, string message, string exMessage, string data) { message = message.Replace("'", "").Replace("\"", "").Replace("<", "").Replace(">", ""); exMessage = exMessage.Replace("'", "").Replace("\"", "").Replace("<", "").Replace(">", ""); return string.Format("{{success:{0},total:{1},data:{2},message:\"{3}\",exMessage:\"{4}\"}}", sucess.ToString().ToLower(), total, data, message, exMessage); } /// <summary> /// 返回失败信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="message"></param> /// <param name="exMessage"></param> /// <returns></returns> public static string ReturnFailureMessage(string message, string exMessage) { return ReturnMessage(false, 0, message, exMessage, "[]"); } /// <summary> /// 返回失败信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="message"></param> /// <param name="exMessage"></param> /// <returns></returns> public static string ReturnFailureMessageTouch(string message, string exMessage) { return "{\"success\":\"false\",\"msg\":\"" + exMessage + "\"}"; } /// <summary> /// 返回成功信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="total"></param> /// <param name="message"></param> /// <param name="exMessage"></param> /// <param name="objList"></param> /// <returns></returns> public static string ReturnSuccessMessage<T>(int total, string message, string exMessage, List<T> objList) { string data = ListToJson<T>(objList); return ReturnMessage(true, total, message, exMessage, data); } public static string ReturnSuccessMessageTouch<T>(T obj) { string data = ObjectToJson<T>(obj); return data; } /// <summary> /// 返回成功信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="total"></param> /// <param name="message"></param> /// <param name="exMessage"></param> /// <param name="objList"></param> /// <returns></returns> public static string ReturnSuccessMessage(string message, string exMessage) { return ReturnMessage(true, 0, message, exMessage, "[]"); } /// <summary> /// 返回成功信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="total"></param> /// <param name="message"></param> /// <param name="exMessage"></param> /// <param name="objList"></param> /// <returns></returns> public static string ReturnSuccessMessageTouch(string message, string exMessage) { return "{\"success\":\"true\",\"msg\":\"" + message + "\"}"; } /// <summary> /// 返回成功信息 /// </summary> /// <param name="message"></param> /// <param name="exMessage"></param> /// <param name="data">JSON 对象</param> /// <returns></returns> public static string ReturnSuccessMessage(string message, string exMessage, string data) { return ReturnMessage(true, 0, message, exMessage, "[" + data + "]"); } /// <summary> /// 返回成功消息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="total"></param> /// <param name="message"></param> /// <param name="exMessage"></param> /// <param name="obj"></param> /// <returns></returns> public static string ReturnSuccessMessage<T>(int total, string message, string exMessage, T obj) { string data = ObjectToJson<T>(obj); return ReturnMessage(true, total, message, exMessage, data); } /// <summary> /// 把对象列表编码为Json数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="objList"></param> /// <returns></returns> public static string ListToJson<T>(List<T> objList) { JsonSerializer serializer = new JsonSerializer(); SerializerSetting(serializer); AddIsoDateTimeConverter(serializer); using (TextWriter sw = new StringWriter()) using (JsonWriter writer = new JsonTextWriter(sw)) { serializer.Serialize(writer, objList); return sw.ToString(); } } /// <summary> /// 把一个对象编码为Json数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static string ObjectToJson<T>(T obj) { JsonSerializer serializer = new JsonSerializer(); SerializerSetting(serializer); AddIsoDateTimeConverter(serializer); using (TextWriter sw = new StringWriter()) using (JsonWriter writer = new JsonTextWriter(sw)) { serializer.Serialize(writer, obj); return sw.ToString(); } } /// <summary> /// 根据传入的Json数据,解码为对象(一个) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data"></param> /// <returns></returns> public static T DecodeObject<T>(string data) { JsonSerializer serializer = new JsonSerializer(); serializer.MissingMemberHandling = MissingMemberHandling.Ignore; AddIsoDateTimeConverter(serializer); StringReader sr = new StringReader(data); return (T)serializer.Deserialize(sr, typeof(T)); } /// <summary> /// 功能同DecodeObject /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data"></param> /// <returns></returns> public static List<T> DecodeObjectList<T>(string data) { JsonSerializer serializer = new JsonSerializer(); serializer.MissingMemberHandling = MissingMemberHandling.Ignore; AddIsoDateTimeConverter(serializer); StringReader sr = new StringReader(data); return (List<T>)serializer.Deserialize(sr, typeof(List<T>)); } public static string EncodeAjaxResponseJson(string jsonString, string callback) { String responseString = ""; //判断是否jsonp调用 if (!String.IsNullOrEmpty(callback)) { //jsonp调用,需要封装回调函数,并返回 responseString = callback + "(" + jsonString + ")"; } else { //普通ajax调用,直接返回Json数据 responseString = jsonString; } return responseString; } public static string ExtGridSortInfo(string property, string direction) { return string.Format("[{{\"property\":\"{0}\",\"direction\":\"{1}\"}}]", property, direction); } } } }
View Code
调用方式:
public static T PostMethodToObj<T>(string metodUrl, string jsonBody) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(metodUrl); request.Method = "post"; request.ContentType = "application/json;charset=UTF-8"; //request.Connection="keep-alive"; var stream = request.GetRequestStream(); using (var writer = new StreamWriter(stream)) { writer.Write(jsonBody); writer.Flush(); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string json = GetResponseString(response); return Utility.JsonUtility.DecodeObject<T>(json); }
相关文章推荐
- JavaScript第二课
- 通过禁用javascript给Eclipse加速
- JavaScript中setTimeout的作用域以及this指向问题
- jsp 4种常用语法3个编译指令7个动作指令
- poj1062解题报告(Dijskstra)
- JavaScript权威指南_123_第15章_脚本化文档_15.4-属性-数据集属性
- JavaScript权威指南_122_第15章_脚本化文档_15.4-属性-获取和设置非标准HTML属性
- JavaScript返回上一页的三种方法及区别介绍
- js控制div不随滚动条移动
- JSON结构描述
- JSP —— include标签的使用
- JavaScript一些格式化日期方法
- ExtJs Panel滚动条
- JavaScript学习13:事件绑定
- JSP常见错误
- js的入门文章
- JavaScript返回上一页的三种方法及区别介绍
- Jsp的隐式对象和EL的隐式对象学习
- JS 引用类型 Math 对象 JS学习笔记2015-7-3(第74天)
- [LeetCode][JavaScript]Evaluate Reverse Polish Notation