您的位置:首页 > Web前端 > JavaScript

C# Winform反序列化复杂json字符串

2015-07-04 10:43 627 查看
最近接的私单是一个CS项目,里面所有的操作都是通过调用API接口来进行的。

接口详细说明

协议: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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: