C#怎么从http上返回JSON数据并读取?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#怎么从http上返回JSON数据并读取?相关的知识,希望对你有一定的参考价值。
如题,用C#从某个Http上返回JSON数据,然后用一串数组存储其中每一条的ID、Size、Filter、URL属性,并分行打印
大概思路是:1.根据某个地址获取到JSON;2.将此JSON解析;3.将其中的ID、Size、Filter、URL存到某个数组中(JSON中已知每一条数据都包含这四个属性)。
[WebMethod]
public string Project(string paramaters)
return paramaters;
实现代码
public string Post(string methodName, string jsonParas)
string strURL = Url + "/" + methodName;
//创建一个HTTP请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
//Post请求方式
request.Method = "POST";
//内容类型
request.ContentType = "application/x-www-form-urlencoded";
//设置参数,并进行URL编码
//虽然我们需要传递给服务器端的实际参数是JsonParas(格式:[\"UserID\":\"0206001\",\"UserName\":\"ceshi\"]),
//但是需要将该字符串参数构造成键值对的形式(注:"paramaters=[\"UserID\":\"0206001\",\"UserName\":\"ceshi\"]"),
//其中键paramaters为WebService接口函数的参数名,值为经过序列化的Json数据字符串
//最后将字符串参数进行Url编码
string paraUrlCoded = System.Web.HttpUtility.UrlEncode("paramaters");
paraUrlCoded += "=" + System.Web.HttpUtility.UrlEncode(jsonParas);
byte[] payload;
//将Json字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
//设置请求的ContentLength
request.ContentLength = payload.Length;
//发送请求,获得请求流
Stream writer;
try
writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
catch (Exception)
writer = null;
Console.Write("连接服务器失败!");
//将请求参数写入流
writer.Write(payload, 0, payload.Length);
writer.Close();//关闭请求流
String strValue = "";//strValue为http响应所返回的字符流
HttpWebResponse response;
try
//获得响应流
response = (HttpWebResponse)request.GetResponse();
catch (WebException ex)
response = ex.Response as HttpWebResponse;
Stream s = response.GetResponseStream();
//服务器端返回的是一个XML格式的字符串,XML的Content才是我们所需要的Json数据
XmlTextReader Reader = new XmlTextReader(s);
Reader.MoveToContent();
strValue = Reader.ReadInnerXml();//取出Content中的Json数据
Reader.Close();
s.Close();
return strValue;//返回Json数据
Url的格式样例:"http://59.68.29.106:8087/IFT_Project.asmx"
methodName参数就是"Project"
JsonParas就是使用C# javascriptSerializer将List<Object>类型的对象序列化之后得到的值,数据格式:[\"UserID\":\"0206001\",\"UserName\":\"ceshi\"],Json数据中的中括号代表由着多个对象集合序列化,花括号代表一个对象序列化得到的结果,花括号里面的内容使用键值对的方式展示,多个属性之间用逗号隔开,每个对象也用逗号隔开。
request.ContentType必须设置值,建议使用"application/x-www-form-urlencoded",设置其他值就很容易报服务器内部异常,使用这种方式服务接口方法返回的是xml格式的字符串
payload将请求参数转换成二进制来保存,此处一定要将“paramaters”加入其中,不然会报异常缺少参数,paramaters就是服务接口函数的参数名。函数中使用了URL编码,注意在编码的时候只需要将键和值进行编码,不要将中间的=进行编码,不然getResponse的时候会报异常。
request.ContentLength也是必须设置的值
在得到响应流之后Stream s = response.GetResponseStream();需要使用Reader来解析响应流,这个地方我使用的是XmlTextReader,因为我服务方法返回的是xml格式的字符串,其中Json数据在xml的Content中。在取出Json数据之后,再进行相应的反序列化即可得到对象。 参考技术A 我之前做过网络和桌面应用的数据对接,你看看
/*
1、对象集合
*/
[DataContract]
public class Items
[DataMember]
public List<ddd> dddget;set;
public Items()
ddd = new List<ddd>();
//把字符串转换为对象
public static Items FormJson(string json)
try
System.Runtime.Serialization.Json.DataContractJsonSerializer a = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Items));
using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
return (Items)a.ReadObject(stream);
catch (Exception)
return null;
/*
简单的对象
*/
[DataContract]
public class ddd
[DataMember]
public int cidget;set;
[DataMember]
public int pid get; set;
[DataMember]
public int oid get; set;
[DataMember]
public string view_type get; set;
[DataMember]
public string status get; set;
[DataMember]
public string name get; set;
[DataMember]
public string eng_name get; set;
[DataMember]
public string ctpl get; set;
[DataMember]
public string url get; set;
/*
2、从HTTP请求中得到数据
*/
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.bursonchurch.net//index.php?Interface-index-keyt-123-act-catelist.html");
request.Timeout = 5000;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine("内容类型:"+response.ContentType);
Console.WriteLine("内容长度:"+response.ContentLength);
Console.WriteLine("服务器名:"+response.Server);
Console.WriteLine("资源的URI:"+response.ResponseUri);
Console.WriteLine("HTTP协议版本:" + response.ProtocolVersion);
Console.WriteLine("相应状态:"+response.StatusCode);
Console.WriteLine("相应方法:"+response.Method);
//头信息
for (int i = 0; i < response.Headers.Count; ++i)
Console.WriteLine("\\nHeader Name:0,----------Value:1", response.Headers.Keys[i], response.Headers[i]);
StreamReader sr = new StreamReader(response.GetResponseStream());
string jsonstr = sr.ReadToEnd();
//例子 :假设得到的json数据 下面序列化为对象
string test = "\\"ddd\\":[\\"cid\\":\\"1\\",\\"pid\\":\\"0\\",\\"oid\\":\\"0\\",\\"view_type\\":\\"0\\",\\"status\\":\\"1\\",\\"name\\":\\"西科推荐\\",\\"eng_name\\":\\"\\",\\"ctpl\\":\\"\\",\\"ctitle\\":\\"\\",\\"ckeywords\\":\\"\\",\\"cdescription\\":\\"\\",\\"url\\":\\"http:\\\\/\\\\/www.bursonchurch.net\\\\/index.php?Cate-index-cid-1.html\\",\\"cid\\":\\"2\\",\\"pid\\":\\"0\\",\\"oid\\":\\"2\\",\\"view_type\\":\\"0\\",\\"status\\":\\"1\\",\\"name\\":\\"校园活动\\",\\"eng_name\\":\\"\\",\\"ctpl\\":\\"\\",\\"ctitle\\":\\"\\",\\"ckeywords\\":\\"\\",\\"cdescription\\":\\"\\",\\"url\\":\\"http:\\\\/\\\\/www.bursonchurch.net\\\\/index.php?Cate-index-cid-2.html\\",\\"cid\\":\\"3\\",\\"pid\\":\\"0\\",\\"oid\\":\\"2\\",\\"view_type\\":\\"0\\",\\"status\\":\\"1\\",\\"name\\":\\"帅哥\\",\\"eng_name\\":\\"\\",\\"ctpl\\":\\"\\",\\"ctitle\\":\\"\\",\\"ckeywords\\":\\"动物世界keword\\",\\"cdescription\\":\\"动物世界s\\",\\"url\\":\\"http:\\\\/\\\\/www.bursonchurch.net\\\\/index.php?Cate-index-cid-3.html\\",\\"cid\\":\\"4\\",\\"pid\\":\\"0\\",\\"oid\\":\\"4\\",\\"view_type\\":\\"1\\",\\"status\\":\\"1\\",\\"name\\":\\"静物\\",\\"eng_name\\":\\"\\",\\"ctpl\\":\\"\\",\\"ctitle\\":\\"\\",\\"ckeywords\\":\\"\\",\\"cdescription\\":\\"\\",\\"url\\":\\"http:\\\\/\\\\/www.bursonchurch.net\\\\/index.php?Cate-index-cid-4.html\\",\\"cid\\":\\"5\\",\\"pid\\":\\"0\\",\\"oid\\":\\"5\\",\\"view_type\\":\\"1\\",\\"status\\":\\"1\\",\\"name\\":\\"美女\\",\\"eng_name\\":\\"\\",\\"ctpl\\":\\"\\",\\"ctitle\\":\\"\\",\\"ckeywords\\":\\"\\",\\"cdescription\\":\\"\\",\\"url\\":\\"http:\\\\/\\\\/www.bursonchurch.net\\\\/index.php?Cate-index-cid-5.html\\"]";
//第一种转
JavaScriptSerializer j = new JavaScriptSerializer();
Items ii = new Items();
ii = j.Deserialize<Items>(jsonstr);
//第二种也行
Items it = Items.FormJson(jsonstr);
response.Close();
Console.ReadKey();追问
能加你球球问几个问题吗,谢谢
本回答被提问者和网友采纳C#如何拿到从http上返回JSON数据?
第一章:C#如何拿到从http上返回JSON数据?
第二章:C#如何解析JSON数据?(反序列化对象)
第三章:C#如何生成JSON字符串?(序列化对象)
第四章:C#如何生成JSON字符串提交给接口(服务器)?
在实际开发中,我们经常会使用到API,所谓API一般就是一个地址,我们称之为接口。然后我们通过用C#对这地址发送请求,请求后,服务器就会给我们返回数据,一般是XML或者JSON,这里我们主要讲述的是JSON。
为了演示,我们这里准备了一个接口,这是一个查询物流的接口。(读者读到这篇文章的时候,接口可能有效,也可能失效,因为接口是网上找的,不是笔者自己写的,但是原理是一样的。)
接口: http://www.kuaidi100.com/query?type=快递公司编码&postid=物流单号
(ps:快递公司编码:申通="shentong" EMS="ems" 顺丰="shunfeng" 圆通="yuantong" 中通="zhongtong" 韵达="yunda" 天天="tiantian" 汇通="huitongkuaidi" 全峰="quanfengkuaidi" 德邦="debangwuliu" 宅急送="zhaijisong")
一般我们拿到接口后,需要拼接成我们需要的地址。比如,我们现在需要查询顺丰物流的367847964498单的结果。那么,我们就需要拼接这个接口,拼接结果如下:
http://www.kuaidi100.com/query?type=shunfeng&postid=367847964498
我们拼接好后,可以直接在浏览器上访问这个地址,看看是不是可以正常访问。如果可以正常访问,说明我们这个接口没有问题。那么,我们现在先在浏览器访问一下。看到下面返回的结果就说明正确。
接下来就是大家最喜欢的写代码环节,为了方便演示,我们这里用winform程序。非常简单,我们新建一个窗体程序,点击后,弹出JSON数据即可。界面如下:
建好窗体,放一个按钮,然后我们来创建一个类HttpUitls。这个是这个文章中最重要的。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; namespace WindowsFormsApplication1 { public class HttpUitls { public static string Get(string Url) { //System.GC.Collect(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Proxy = null; request.KeepAlive = false; request.Method = "GET"; request.ContentType = "application/json; charset=UTF-8"; request.AutomaticDecompression = DecompressionMethods.GZip; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); if (response != null) { response.Close(); } if (request != null) { request.Abort(); } return retString; } public static string Post(string Url, string Data, string Referer) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; request.Referer = Referer; byte[] bytes = Encoding.UTF8.GetBytes(Data); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = bytes.Length; Stream myResponseStream = request.GetRequestStream(); myResponseStream.Write(bytes, 0, bytes.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); if (response != null) { response.Close(); } if (request != null) { request.Abort(); } return retString; } } }
这个类有两个方法,一个是Get,一个是Post,本篇文章我们只需要用到Get就可以了。
然后是点击按钮的方法
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //我们的接口 string url = "http://www.kuaidi100.com/query?type=shunfeng&postid=367847964498"; //将接口传入,这个HttpUitls的类,有兴趣可以研究下,也可以直接用就可以,不用管如何实现。 string getJson = HttpUitls.Get(url); MessageBox.Show(getJson); } } }
然后是运行结果
到这一步说明我们已经成功拿到接口给我们返回的JSON数据了。那么我们会在下一篇文章中讲解如何使用这JSON数据,也就是解析JSON
以上是关于C#怎么从http上返回JSON数据并读取?的主要内容,如果未能解决你的问题,请参考以下文章
ssm框架 怎么用ajax查询从数据库读取数据 返回json格式
Web app ------ 从Servlet读取Json数据并显示,生成历史数据曲线图