最近接的私单是一个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”:””,"errcode":”,”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需要先添加如下两个引用:

新建HttpClientUtil类,封装API请求的类,

      // @POST 方法
public static string PostMethodToString(string metodUrl, string jsonBody)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(metodUrl);
request.Method = "post";
request.ContentType = "application/json;charset=UTF-8";
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 json;
//return ((JObject)JsonConvert.DeserializeObject(json)).ToString();
}

然后新建一个范序列化的类JsonHelper

using System.Web.Script.Serialization;

        /// <summary>
/// 把json字符串转成对象
/// </summary>
/// <typeparam name="T">对象</typeparam>
/// <param name="data">json字符串</param>
public static T Deserialize<T>(string data)
{
JavaScriptSerializer json = new JavaScriptSerializer();
return json.Deserialize<T>(data);
}

最后,我们来看调用方法:这里采用了两种调用方式,第一种是直接拼接json字符串,第二种是通过构造强类型类,然后序列化为json字符串

        /// <summary>
/// 根据餐桌等级ID获取餐桌列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="graId"></param>
/// <returns></returns>
private List<FoodTable> LoadAllData(int pageIndex, int graId)
{
//string jsonBody = "{ 'action': 'food_t_list', 'access_token':'" + CommonProperty.ACCESS_TOKEN +
// "', 'data': { 'pageIndex': '" + pageIndex + "', 'pageSize': '" + CommonProperty.PageSize + "', 'storeId': "
+ CommonProperty.StoreId + ",foodGId:'" + graId + "'} }";
//string json = HttpClientUtil.PostMethodToString(CommonProperty.HttpUrl, jsonBody);
//List<FoodTable> table = JsonHelper.Deserialize<FoodList>(json).data.foodTables; FoodTListMode mode = new FoodTListMode();
mode.pageIndex = ;
mode.pageSize = CommonProperty.PageSize;
mode.foodGId = graId;
mode.storeId = CommonProperty.StoreId; DataHelper<FoodList> data = new DataHelper<FoodList>();
List<FoodTable> table = data.LoadData(CommonProperty.FoodTList, mode).data.foodTables;
listAll.AddRange(table); FoodList f = new FoodList(); if (table.Count > CommonProperty.PageSize)
{
LoadAllData(pageIndex + , graId);
}
return listAll;
}

根据大家的建议,重新试用了下json.net,这次成功了,之前调用的方法有问题

方法一、

      // REST @POST 方法
public static T DoPostMethodToObj<T>(string metodUrl, string jsonBody)
{
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 JsonHelper.Deserialize<T>(json); return JsonConvert.DeserializeObject<T>(json);
}

方法二、新建JsonUtility类

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, , 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, , 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, , 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);
}
}
}
}

调用方式:

     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);
}

C# Winform反序列化复杂json字符串的更多相关文章

  1. Newtonsoft.Json.dll反序列化JSON字符串的方法

      1.直接反序列化JSON字符串 //引用序列化.反序列化JSON字符串用到的空间 using Newtonsoft.Json; using Newtonsoft.Json.Linq; //定义一个 ...

  2. Newtonsoft.Json.dll 反序列化JSON字符串

    上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向 ...

  3. C#解析JSON字符串总结

    JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...

  4. C#解析JSON字符串总结(转载)

    JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...

  5. 序列化与反序列化之JSON

    在不同编程语言之间传递对象,须把对象序列化为标准格式,比如XML 但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可被所有语言读取,也可方便地存储到磁盘或者通过网络传输 JSON不 ...

  6. C# JSON字符串序列化与反序列化

    JSON与c#对象转换http://hi.baidu.com/donick/item/4d741338870c91fe97f88d33 C# JSON字符串序列化与反序列化 – http://www. ...

  7. .NET中如何使用反序列化JSON字符串/序列化泛型对象toJsonStr

    在进行 .NET Web MVC 框架开发的网站程序的时候,我们都会遇到最关键的问题,数据传输.   .NET MVC 4中的ControllerBase类建议我们用ViewBag动态数据字典形式(t ...

  8. JSON字符串序列化与反序列化浅试

    一.添加引用(using Newtonsoft.Json.Linq;) 二. 1.生成json字符串源码 List<string> list = new List<string> ...

  9. c# .net 读取json 字符串 与序列化和反序列化json字符串

    命名空间 using Newtonsoft.Json.Linq; JObject obj = JObject.Parse("json字符串");用 obj["" ...

随机推荐

  1. Java——List集合

    package om.hanqi.test; import java.util.ArrayList; import java.util.List; public class Test01 { publ ...

  2. [转]Java并发编程:Lock

    链接: http://www.cnblogs.com/dolphin0520/p/3923167.html

  3. Design1:数据层次结构建模之一

    1,在现实世界中,有很多现象存在层次结构,公司的人事职称是典型的层次结果,如下图 Sql Server是关系型DB,适合存储二维关系的数据,如何存储具有层次结构的数据了?需要使用一个字段ParentI ...

  4. 前端工程师技能之photoshop巧用系列第四篇——图片格式

    × 目录 [1]图片格式 [2]保存设置 前面的话 对于前端来说,图片格式是需要重要掌握的知识.本文是photoshop巧用系列第四篇——图片格式 图片格式 目前在前端的开发中常用的图片格式有jpg. ...

  5. java中得到classpath和当前类的绝对路径的一些方法(路径中的%20"进行替换空格)

    原网址:http://blog.csdn.net/shendl/article/details/1427475 (注意:利用下面方式得到路径,如果路径中有空格字符, 那么会有"%20&quo ...

  6. 【原创】探索Newlife X组件利器之:XCoder点滴[附下载]

    本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www.cnblogs ...

  7. Request 接收参数乱码原理解析二:浏览器端编码原理

    上一篇<Request 接收参数乱码原理解析一:服务器端解码原理>,分析了服务器端解码的过程,那么浏览器是根据什么编码的呢? 1. 浏览器解码 浏览器根据服务器页面响应Header中的“C ...

  8. Image Wall - jQuery & CSS3 图片墙效果

    今天我们要为您展示如何基于 jQuery 和 CSS3 创建一个整洁的图片墙效果.我们的想法是在页面上洒上一些大小不同的缩略图,并在当我们点击图片时候显示丝带,会显示一些描述,再次点击缩略图时,丝带将 ...

  9. ionic+nodejs开发遇到的跨域和post请求数据问题

    最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 开发环境搭建 项目地址 https://github.com/ytudt/nodejsApp 代码和问题都会在之后的学习 ...

  10. 理解SQL Server是如何执行查询的 (2/3)

    查询执行的内存授予(Query Execution Memory Grant) 有些操作符需要较多的内存才能完成操作.例如,SORT.HASH.HAS聚合等.执行计划通过操作符需要处理数据量的预估值( ...