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中已知每一条数据都包含这四个属性)。

Web Service接口方法
   [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数据并读取?的主要内容,如果未能解决你的问题,请参考以下文章

C#如何拿到从http上返回JSON数据?

C#从http上拿返回JSON数据

ssm框架 怎么用ajax查询从数据库读取数据 返回json格式

Web app ------ 从Servlet读取Json数据并显示,生成历史数据曲线图

Web app ------ 从Servlet读取Json数据并显示,生成历史数据曲线图

c# HttpWebResponse判断返回请求的问题