• C#--序列化--JSON和对象互转方法


    方法1,通用方法,以下方法是转载别人的

    1,添加引用

     2,方法

     /// <summary>
            /// 转换对象为JSON格式数据
            /// </summary>
            /// <typeparam name="T">类</typeparam>
            /// <param name="obj">对象</param>
            /// <returns>字符格式的JSON数据</returns>
            public static string GetJSON<T>(object obj)
            {
                string result = String.Empty;
                try
                {
                    System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
                        new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                    {
                        serializer.WriteObject(ms, obj);
                        result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return result;
            }
    
            private static string getJsonByObject(Object obj)
            {
                //实例化DataContractJsonSerializer对象,需要待序列化的对象类型
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                //实例化一个内存流,用于存放序列化后的数据
                MemoryStream stream = new MemoryStream();
                //使用WriteObject序列化对象
                serializer.WriteObject(stream, obj);
                //写入内存流中
                byte[] dataBytes = new byte[stream.Length];
                stream.Position = 0;
                stream.Read(dataBytes, 0, (int)stream.Length);
                //通过UTF8格式转换为字符串
                return Encoding.UTF8.GetString(dataBytes);
            }
    
            private static Object getObjectByJson(string jsonString, Object obj)
            {
                //实例化DataContractJsonSerializer对象,需要待序列化的对象类型
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                //把Json传入内存流中保存
                MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
                // 使用ReadObject方法反序列化成对象
                return serializer.ReadObject(stream);
            }
    

      

    方法2,使用JavaScriptSerializer

    1,添加引用

    2,方法

                //JavaScriptSerializer json = new JavaScriptSerializer();
                //// 反序列化JSON字符串到对象
                //User user = json.Deserialize<User>(jsonString);
                //// 序列化对象为JSON字符串
                //string jsonString = json.Serialize(user);
    

      

    3,实际应用

    1,对象转JSON,客户端提交POST请求

            private void btn_post_Click(object sender, EventArgs e)
            {
                string url = this.txt_url.Text;
                TighteningData data=new TighteningData()
                {
                    Angle = txt_angle.Text,
                    AngleMax = txt_angleMax.Text,
                    AngleMin = txt_angleMin.Text,
                    DeviceName = txt_deviceName.Text,
                    Index = txt_index.Text,
                    ProductName = txt_productName.Text,
                    Pset = txt_pset.Text,
                    SN = txt_sn.Text,
                    TighteningStatus = txt_tighteningStatus.Text,
                    Torque = txt_torque.Text,
                    TorqueMax = txt_torqueMax.Text,
                    TorqueMin = txt_torqueMin.Text
                };
    
                //string body = $"Angle={data.Angle}&AngleMax={data.AngleMax}&AngleMin={data.AngleMin}&DeviceName={data.DeviceName}&Pset={data.Pset}&SN={data.SN}&TighteningStatus={data.TighteningStatus}&Torque={data.Torque}&TorqueMax={data.TorqueMax}&TorqueMin={data.TorqueMin}&Index={data.Index}&ProductName={data.ProductName}";
                //方法【1】:序列化对象为JSON字符串
                //string body = getJsonByObject(data);
    
                //方法【2】:序列化对象为JSON字符串
                JavaScriptSerializer json = new JavaScriptSerializer();
                string body = json.Serialize(data);
    
                string res = HttpWebRequestPost(url, body);
                MessageBox.Show(res);
            }
    

      

    2,服务端接收POST请求,解析JSON数据

            private  string HandleRequest(HttpListenerRequest request, HttpListenerResponse response)
            {
                string data = null;
                try
                {
                    var byteList = new List<byte>();
                    var byteArr = new byte[2048];
                    int readLen = 0;
                    int len = 0;
                    //接收客户端传过来的数据并转成字符串类型
                    do
                    {
                        readLen = request.InputStream.Read(byteArr, 0, byteArr.Length);
                        len += readLen;
                        byteList.AddRange(byteArr);
                    } while (readLen != 0);
                    data = Encoding.UTF8.GetString(byteList.ToArray(), 0, len);
    
                    //获取得到数据data可以进行其他操作
                }
                catch (Exception ex)
                {
                    response.StatusDescription = "404";
                    response.StatusCode = 404;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine($"在接收数据时发生错误:{ex.ToString()}");
                    return $"在接收数据时发生错误:{ex.ToString()}";//把服务端错误信息直接返回可能会导致信息不安全,此处仅供参考
                }
                response.StatusDescription = "200";//获取或设置返回给客户端的 HTTP 状态代码的文本说明。
                response.StatusCode = 200;// 获取或设置返回给客户端的 HTTP 状态代码。
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine($"接收数据完成:{data.Trim()},时间:{DateTime.Now.ToString()}");
                JavaScriptSerializer js = new JavaScriptSerializer();   //实例化一个能够序列化数据的类
                RequestDataModel requestDataModel = js.Deserialize<RequestDataModel>(data);
                if (DataTriggerEvent != null)
                {
                    DataTriggerEvent(requestDataModel);
                }
                return $"接收数据完成";
            }
    

      

  • 相关阅读:
    搭建论坛
    修改ecshop页面
    通信失败的原因
    UCenter教程
    discuz论坛 手机登录
    discuz论坛 安装短信插件
    eccshop获取商品详情属性的字段调用值
    php与discuz形成的对接
    php
    php论坛
  • 原文地址:https://www.cnblogs.com/baozi789654/p/14347523.html
Copyright © 2020-2023  润新知