在后台发送POST、GET请求并获得返回的JSON数据进行解析成JObject或者对象类(泛型)——从头详解C#版

平常我们后台请求接口返回了json格式的字符串,可用于Controller层直接返回给前台展示数据使用。最常用的这是如此。

但是如果我们想直接在后台发送请求并拿到的JSON字符串数据进行使用和逻辑处理,那么对于后台开发人员来说JSON字符串操作是很不方便的,将JSON字符串转换为JObject类型或者相应的对象类来操作会很方便。下面是具体实现过程:

 

此工具类名为HttpUtils,需要手动导入的引用有:

Newtonsoft.Json (使用JsonConvert)

System.Runtime.Serialization (使用DataContractJsonSerializer)

1、编写向指定接口发送POST或者GET请求

POST方式发送请求:

        /// <summary>
        /// post形式发送请求
        /// </summary>
        /// <param name="PostUrl">请求地址url</param>
        /// <param name="ParamData">传递的参数</param>
        /// <returns></returns>
        public static string PostWebReq(string PostUrl, string ParamData)
        {
            string ret = string.Empty;
            try
            {
                byte[] byteArray = Encoding.UTF8.GetBytes(ParamData);
                HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(PostUrl));
                webReq.Method = "POST";
                webReq.ContentType = "application/x-www-form-urlencoded";
                webReq.ContentLength = byteArray.Length;

                Stream newStream = webReq.GetRequestStream();
                newStream.Write(byteArray, 0, byteArray.Length);
                newStream.Close();

                HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                ret = sr.ReadToEnd();

                sr.Close();
                response.Close();
                newStream.Close();
            }
            catch (WebException ex)
            {
                //   Log.WriteLog(LogFile.Error, ex.Message);
            }
            finally
            {
                // Log.WriteLog(LogFile.Info, ret);
            }
            return JsonSerializerUtil.JsonSerializer(ret);
        }

调用实例:

        /// <summary>
        /// Post请求测试
        /// </summary>
        /// <returns></returns>
        public string PostTest()
        {
            Hashtable hash = new Hashtable();
            hash.Add("psncode", psncode);
            ArrayList a = new ArrayList(10);
            a.Add(hash);
            //JsonConvert必须需要导入Newtonsoft.Json引用
            string str = HttpUtils.PostWebReq(@"http://157.45.47.1:6666/service/psntrn", JsonConvert.SerializeObject(a));
            string splitStr = str.Replace(@"\\\", "");
            return JsonConvert.SerializeObject(splitStr);
        }

GET方式发送请求:

        /// <summary>
        /// Get方式发送请求获得JSON格式的字符串数据 2019年5月30日15:40:29 lidongsheng
        /// </summary>
        /// <param name="GetUrl">请求地址url</param>
        /// <param name="ParamData">要传递的参数,key、value型</param>
        /// <returns></returns>
        public static string GetWebReq(string GetUrl, Dictionary<string, string> ParamData)
        {
            string jsonstr = string.Empty;
            try
            {
                if (ParamData != null)
                {
                    GetUrl = GetUrl + "?";
                    foreach (KeyValuePair<string, string> kv in ParamData)
                    {
                        GetUrl = GetUrl + kv.Key + "=" + kv.Value + "&";
                    }
                    GetUrl = GetUrl.Substring(0, GetUrl.Length - 1);
                }
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(GetUrl);
                request.Method = "GET";
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                jsonstr = stream.ReadLine();
            }
            catch (WebException ex)
            {
                jsonstr = null;
                 //Log.WriteLog(LogFile.Error, ex.Message);
            }
            finally
            {
                //Log.WriteLog(LogFile.Info, ret);
            }
            return jsonstr;
        }

调用实例:

        /// <summary>
        /// GET请求测试
        /// </summary>
        /// <returns></returns>
        public string GETTest()
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("param", "45");
            return HttpUtils.GetWebReq(@"http://157.45.47.1:6666/service/shifts", dic);
        }

上面的只是返回了json格式的字符串,可用于Controller层直接返回给前台展示数据使用。最常用的这是如此。

但是如果我们想直接在后台把拿到的JSON字符串数据进行使用和逻辑处理,那么对于后台开发人员来说JSON字符串操作是很不方便的,将JSON字符串转换为JObject类型或者相应的对象类来操作会很方便。

JSON字符串转换JObject或者相应对象类方法:

        /// <summary>
        /// json字符串转换为Jobject或者对象类 2019年5月30日15:40:55 lidongsheng
        /// 使用说明:假设jsonstr为:
        ///     {
        ///     "code": 0,
        ///     "msg": "成功",
        ///     "data": [
        ///         {
        ///             "id": "12",
        ///             "name": "郑州",
        ///         },
        ///         {
        ///             "id": "11",
        ///             "name": "禹州",
        ///         }
        ///             ]
        ///     }
        /// 返回的Jobject retuJobject里包含 errcode、errmsg、List<JObject> data.
        /// 要想获得data,调用者需自行将返回的JObject再做一次转换为Jobject:retuJobject.GetValue("data").ToObject<List<JObject>>();
        /// 如果T为对象类 则T对象类上面必须有[DataContract]注解 每个属性上面必须有[DataMember]注解,如下所示。
        /// 
        ///   [DataContract] 
        ///   class Tclass
        ///     {
        ///         [DataMember]
        ///         public int code { get; set; }
        ///         [DataMember]
        ///         public string msg { get; set; }
        ///         [DataMember]
        ///         public List<data> data { get; set; }
        ///     }
        ///   [DataContract]  
        ///   class data
        ///     {
        ///         [DataMember]
        ///         public string id{ get; set; }
        ///         [DataMember]
        ///         public string name { get; set; }
        ///     }
        ///
        /// </summary>
        /// <typeparam name="T">返回类型</typeparam>
        /// <param name="jsonstr">json字符串</param>
        /// <returns></returns>
        public static T JsonToClass<T>(string jsonstr)
        {
            Type Ttype = typeof(T);
            if (Ttype.Name.Equals("JObject"))
            {
                return (T)JsonConvert.DeserializeObject(jsonstr);
            }
            else
            {
                var ser = new DataContractJsonSerializer(typeof(T));
                var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonstr));
                T Tclass = (T)ser.ReadObject(ms);
                return Tclass;
            }
        }

调用实例:

        /// <summary>
        /// JSON字符串转换JObject或者相应对象测试方法
        /// </summary>
        /// <typeparam name="T">要获得的数据类型:Jobjec、对象类</typeparam>
        /// <param name="jsonstr">班别的据点</param>
        /// <returns></returns>
        public void GetJobject(string jsonstr)
        {
            JObject jo = HttpUtils.JsonToClass<JObject>(jsonstr);
            string code = jo.GetValue("code").ToString();//0
            string msg = jo.GetValue("msg").ToString();//成功
            List<JObject> data = jo.GetValue("data").ToObject<List<JObject>>();
            data[0].GetValue("id").ToString();//12
            data[0].GetValue("name").ToString();//郑州
            data[1].GetValue("id").ToString();//11
            data[1].GetValue("name").ToString();//禹州
        }
        [DataContract]
        class Tclass
        {
            [DataMember]
            public int code { get; set; }
            [DataMember]
            public string msg { get; set; }
            [DataMember]
            public List<data> data { get; set; }
        }
        [DataContract]
        class data
        {
            [DataMember]
            public string id { get; set; }
            [DataMember]
            public string name { get; set; }
        }
        /// <summary>
        /// JSON字符串转换相应对象测试方法
        /// </summary>
        /// <typeparam name="T">要获得的数据类型:Jobjec、对象类</typeparam>
        /// <param name="jsonstr">班别的据点</param>
        /// <returns></returns>
        public void GetTClass(string jsonstr)
        {
            Tclass tc = HttpUtils.JsonToClass<Tclass>(jsonstr);
            string code = tc.code.ToString();//0
            string msg = tc.msg.ToString();//成功
            List<data> data = tc.data;
            data[0].id.ToString();//12
            data[0].name.ToString();//郑州
            data[1].id.ToString();//11
            data[1].name.ToString();//禹州
        }

 

好了,这就是完整一个实例~~最近心情太糟糕了,唉,达不到理想的样子,现实和理想的差距。

发表评论

电子邮件地址不会被公开。