平常我们后台请求接口返回了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();//禹州
}
好了,这就是完整一个实例~~最近心情太糟糕了,唉,达不到理想的样子,现实和理想的差距。