需求:从客户给的网址中读取json格式的数据。
找了好多资料,都不太好使,看到了一篇很有帮助的文章。以下大部分内容和这篇找到的文章近似。太不容易了,同时也感谢这篇文章的作者心所欲。
https://www.cnblogs.com/zoujinhua/p/10330066.html
下面总结一下。
在实际开发中,我们经常会使用到API,所谓API一般就是一个地址,我们称之为接口。
然后我们通过c#对这地址发送请求,请求后,服务器就会给我们返回数据,一般是XML或Json格式,这里我们主要讲述的是Json。
这里我们有一个网址:http://cfwincad.cfsuper.com/api/project/opt_1D_InfoDetail?TenantId=14984910843973&ID=923
直接在浏览器上访问这个地址,可以正常访问,可以看到json格式的数据。
接下来就是大家最喜欢的代码环节,这里用的winform程序,我们建立了一个窗体程序。点击后,显示Json数据就可以,界面如下:
建好窗体,这里放了一个读取Json的按钮,因为字符较多,一般的文本框TextBox显示不全,这里我在工具箱里拖拽了一个richTextBox1来显示Json数据。
然后我们来创建一个类,右键项目名称--添加--类。这里我的类名为Http.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace c_解析json2
{
public class Http
{
//这个类有两个方法,一个是Get,一个是Post,这里只需Get
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。
然后是点击按钮读取Json的方法
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json; // 引入这个库
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Drawing.Text;
using System.Net;
using System.IO;
using System.Collections;
using Newtonsoft.Json.Linq;
using static System.Net.WebRequestMethods;
namespace c_解析json2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 使用JsonConvert方法,DeserializeObject 反序列化
// 为接收到的json数据
// textBox1.Text为接收到的json数据
// 反序列化,是由json转为实体类
// 这个需要引入Newtonsoft.Json这个DLL并using
// 传入我们的实体类还有需要解析的JSON字符串就可以了。然后
// 可以通过实体类使用数据了。
WorkItem cc = JsonConvert.DeserializeObject<WorkItem>(richTextBox1.Text);
//这样就可以读取JSON数据里面的值
//textBox1.Text = cc.profiLav;
MessageBox.Show("profiLav=" + cc.positionX);
//for (int i = 0; i < cc.Count; i++)
//{
// MessageBox.Show("name =" + cc.work[i].name + "\r\n" + cc.work[i].profiLav + "\r\n" + cc.work[i].positionX + "\r\n" + cc.work[i].positionY);
//}
}
// 使用HttpClient类来发送HTTP请求并读取Getman网址中的json数据。
// 读取Json
private void button2_Click(object sender, EventArgs e)
{
//我们的接口
string url = "http://cfwincad.cfsuper.com/api/project/opt_1D_InfoDetail?TenantId=14984910843973&ID=923";
//将接口传入,这个HttpUitls的类,有兴趣可以研究下,也可以直接用就可以,不用管如何实现。
string getJson = Http.Get(url);
richTextBox1.Text = getJson;
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
点击出现Json数据如下,成功了!