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

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

新建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 = 1;
            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 + 1, graId);
            }
            return listAll;
        }
时间: 2024-10-12 20:58:24

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

Memcached中对象反序列化和json字符串用jackson解析成对象的比较

如果项目已经发布,如果临时想对某个在Memcached中的key修改值,那么以对象形式存储的话,将很难修改,但如果以字符串形式存储,通过json解析成对象的话,则会方便很多,因为通过界面往Memcached 添加字符串值是很简单的. 现在来比较一下这两种方式在时间消耗方面的差异: package bean; import java.io.Serializable; public class User implements Serializable{ /** * 序列号 */ private st

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

上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向后台传递JSON数据,并对JSON数据处理,详述见博客< <项目经验>--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中 >),需要对传递的JSON数据反序列化.于是从网上找了许多JSON反序列化的例子,最终决定使用New

C#解析JSON字符串总结

JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]:这种方式是使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/).下载后添加dll引用就能用. 首先添加引用:using Newtonsoft.Json; 新增:本地dll下载:Newtonsoft.Json.rar   引用:using Newt

C# json字符串反序列化

使用情景:开发中JS传递一个Json格式的字符串到后台,后台将json字符串转化成list集合 1 public static class json 2 { 3 public static List<T> JSONStringToList<T>(this string JsonStr) 4 { 5 JavaScriptSerializer Serializer = new JavaScriptSerializer(); 6 List<T> objs = Serializ

Newtonsoft.Json.4.5.0 序列化与反序列化json字符串使用方法总结

在VS里下载安装: Json.NET 5.0.6 http://www.nuget.org/packages/Newtonsoft.Json/5.0.6 反序列化json字符串为List: json字符串如下: 1 {"docs": [{ 2 "uid": 2629577, 3 "nickname": "枕边疯电台", 4 "is_v": "true", 5 "category

[参考]C# JSON字符串序列化与反序列化

C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product>(){ new Product(){Name="苹果",Price=5.5}, new Product(){Name="橘子",Price=2.5}, new Product(){Name="干柿子",Price=16.00} }; Produ

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

综合了下面两篇文章. http://www.cnblogs.com/Jan_Dai/archive/2010/11/09/1872821.html http://www.cnblogs.com/dwfbenben/archive/2013/06/06/3122662.html C#对象和json互转 代码 using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Tex

C++ 基于rapidjson对json字符串的进行序列化与反序列化

json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是使用案例, 如果感觉可以, 就去下载我的源代码自己编译一个库出来(能直接编译通过, 无任何依赖), 下载地址: 上传的CSDN资源正在审核当中, 如果现在需要请联系QQ:497725486, 等审核通过, 把链接贴上 jsonObjDefine.h #pragma once #include "..

【.NET深呼吸】如何反序列化动态JSON

.net本身除了支持SOAP.XML.二进制等序列化和反序列化,后来也加入了对JSON的序列化的支持.然而,在实际开发中,常常会遇到结构不确定的JSON对象,这些对象可能是其他代码动态生成的,你事先无法估计它的结构,甚至它的字段名字是动态改变的. 这种情况下,我们很难用一个固定的类来进行反序列化,后来我尝试过从DynamicObject类派生出一个自定义的动态类型,希望通过这种方法能够将动态生成的JSON读出来,但结果依旧不可:后来我又实现了ISerializable接口,想着自行去控制一下数据