当前位置:   article > 正文

C# 操作JSON数据_c# json 二级 赋值

c# json 二级 赋值

目录

测试:JSON测试及生成实体类网站:https://www.bejson.com/convert/json2csharp

第一章:C#如何拿到从http上返回JSON数据?

第二章:C#如何解析JSON数据?(反序列化对象)

第三章:C#如何生成JSON字符串?(序列化对象)

第四章:C#如何生成JSON字符串提交给接口(服务器)


测试:JSON测试及生成实体类网站:https://www.bejson.com/convert/json2csharp

  1. {
  2. "name": "BeJson",
  3. "url": "http://www.bejson.com",
  4. "page": 88,
  5. "isNonProfit": true,
  6. "address": {
  7. "street": "科技园路.",
  8. "city": "江苏苏州",
  9. "country": "中国"
  10. },
  11. "links": [
  12. {
  13. "name": "Google",
  14. "url": "http://www.google.com"
  15. },
  16. {
  17. "name": "Baidu",
  18. "url": "http://www.baidu.com"
  19. },
  20. {
  21. "name": "SoSo",
  22. "url": "http://www.SoSo.com"
  23. }
  24. ]
  25. }
  1. //如果好用,请收藏地址,帮忙分享。
  2. public class Address
  3. {
  4. /// <summary>
  5. /// 科技园路.
  6. /// </summary>
  7. public string street { get; set; }
  8. /// <summary>
  9. /// 江苏苏州
  10. /// </summary>
  11. public string city { get; set; }
  12. /// <summary>
  13. /// 中国
  14. /// </summary>
  15. public string country { get; set; }
  16. }
  17. public class LinksItem
  18. {
  19. /// <summary>
  20. ///
  21. /// </summary>
  22. public string name { get; set; }
  23. /// <summary>
  24. ///
  25. /// </summary>
  26. public string url { get; set; }
  27. }
  28. public class Root
  29. {
  30. /// <summary>
  31. ///
  32. /// </summary>
  33. public string name { get; set; }
  34. /// <summary>
  35. ///
  36. /// </summary>
  37. public string url { get; set; }
  38. /// <summary>
  39. ///
  40. /// </summary>
  41. public int page { get; set; }
  42. /// <summary>
  43. ///
  44. /// </summary>
  45. public string isNonProfit { get; set; }
  46. /// <summary>
  47. ///
  48. /// </summary>
  49. public Address address { get; set; }
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. public List <LinksItem > links { get; set; }
  54. }

第一章:C#如何拿到从http上返回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。这个是这个文章中最重要的。


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.IO;
  7. namespace WindowsFormsApplication1
  8. {
  9. public class HttpUitls
  10. {
  11. public static string Get(string Url)
  12. {
  13. //System.GC.Collect();
  14. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
  15. request.Proxy = null;
  16. request.KeepAlive = false;
  17. request.Method = "GET";
  18. request.ContentType = "application/json; charset=UTF-8";
  19. request.AutomaticDecompression = DecompressionMethods.GZip;
  20. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  21. Stream myResponseStream = response.GetResponseStream();
  22. StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
  23. string retString = myStreamReader.ReadToEnd();
  24. myStreamReader.Close();
  25. myResponseStream.Close();
  26. if (response != null)
  27. {
  28. response.Close();
  29. }
  30. if (request != null)
  31. {
  32. request.Abort();
  33. }
  34. return retString;
  35. }
  36. public static string Post(string Url, string Data, string Referer)
  37. {
  38. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
  39. request.Method = "POST";
  40. request.Referer = Referer;
  41. byte[] bytes = Encoding.UTF8.GetBytes(Data);
  42. request.ContentType = "application/x-www-form-urlencoded";
  43. request.ContentLength = bytes.Length;
  44. Stream myResponseStream = request.GetRequestStream();
  45. myResponseStream.Write(bytes, 0, bytes.Length);
  46. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  47. StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  48. string retString = myStreamReader.ReadToEnd();
  49. myStreamReader.Close();
  50. myResponseStream.Close();
  51. if (response != null)
  52. {
  53. response.Close();
  54. }
  55. if (request != null)
  56. {
  57. request.Abort();
  58. }
  59. return retString;
  60. }
  61. }
  62. }

这个类有两个方法,一个是Get,一个是Post,本篇文章我们只需要用到Get就可以了。

然后是点击按钮的方法

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace WindowsFormsApplication1
  10. {
  11. public partial class Form1 : Form
  12. {
  13. public Form1()
  14. {
  15. InitializeComponent();
  16. }
  17. private void button1_Click(object sender, EventArgs e)
  18. {
  19. //我们的接口
  20. string url = "http://www.kuaidi100.com/query?type=shunfeng&postid=367847964498";
  21. //将接口传入,这个HttpUitls的类,有兴趣可以研究下,也可以直接用就可以,不用管如何实现。
  22. string getJson = HttpUitls.Get(url);
  23. MessageBox.Show(getJson);
  24. }
  25. }
  26. }

 然后是运行结果

到这一步说明我们已经成功拿到接口给我们返回的JSON数据了。那么我们会在下一篇文章中讲解如何使用这JSON数据,也就是解析JSON

第二章:C#如何解析JSON数据?(反序列化对象)

在上一篇文章中,我们讲解了如何通过API接口获取返回的JSON字符串,那么,这篇文章我们来讲解拿到了返回的JSON字符串后,我们要如何取到里面我们需要的数据呢?这操作叫JSON的反序列化操作。接下里我们将一一解释。

先看效果:这个大家最喜欢。

我们先看一下上一篇文章中返回的字符串。

{"message":"ok","nu":"367847964498","ischeck":"1","condition":"F00","com":"shunfeng","status":"200","state":"3","data":[{"time":"2017-09-21 09:33:09","ftime":"2017-09-21 09:33:09","context":"已签收,感谢使用顺丰,期待再次为您服务","location":""},{"time":"2017-09-21 09:09:48","ftime":"2017-09-21 09:09:48","context":"快件交给巩向涛,正在派送途中(联系电话:18806439871)","location":""},{"time":"2017-09-21 07:02:41","ftime":"2017-09-21 07:02:41","context":"快件到达 【淄博市桓台田庄速运营业点 】","location":""},{"time":"2017-09-20 15:32:00","ftime":"2017-09-20 15:32:00","context":"快件在【淄博市桓台县工业街营业点】已装车,准备发往下一站","location":""},{"time":"2017-09-20 13:37:08","ftime":"2017-09-20 13:37:08","context":"快件到达 【淄博市桓台县工业街营业点】","location":""},{"time":"2017-09-20 10:47:07","ftime":"2017-09-20 10:47:07","context":"快件在【淄博高新集散中心】已装车,准备发往下一站","location":""},{"time":"2017-09-20 10:15:47","ftime":"2017-09-20 10:15:47","context":"快件到达 【淄博高新集散中心】","location":""},{"time":"2017-09-19 23:20:18","ftime":"2017-09-19 23:20:18","context":"快件在【深圳总集散中心】已装车,准备发往下一站","location":""},{"time":"2017-09-19 22:39:27","ftime":"2017-09-19 22:39:27","context":"快件到达 【深圳总集散中心】","location":""},{"time":"2017-09-19 18:57:33","ftime":"2017-09-19 18:57:33","context":"快件在【深圳龙华新区华联社区营业部】已装车,准备发往下一站","location":""},{"time":"2017-09-19 16:12:21","ftime":"2017-09-19 16:12:21","context":"顺丰速运 已收取快件","location":""}]}

上面是我们在上一篇文章中请求返回来的JSON字符串,那么我们现在要解析他。第一步就是要根据这个JSON来写出对应的实体类。用来存放数据。这个实体类如何写的?其实非常简单。因为一般

不需要手动自己写,当然,你要是喜欢也可以自己写。不过我一般使用网站直接转换。自己百度 查一下,JSON转C#实体类,就会有很多网站给你转。

我使用的是这个网站:http://www.bejson.com/convert/json2csharp/

使用很简单,把JSON放进去,点击生成就可以自动生成一个实体类。其实是两个类,不过一般我们写在一个文件里。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace WindowsFormsApplication1
  6. {
  7. /// <summary>
  8. /// JSON数据的实体类
  9. /// </summary>
  10. public class Root
  11. {
  12. /// <summary>
  13. ///
  14. /// </summary>
  15. public string message { get; set; }
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. public string nu { get; set; }
  20. /// <summary>
  21. ///
  22. /// </summary>
  23. public string ischeck { get; set; }
  24. /// <summary>
  25. ///
  26. /// </summary>
  27. public string condition { get; set; }
  28. /// <summary>
  29. ///
  30. /// </summary>
  31. public string com { get; set; }
  32. /// <summary>
  33. ///
  34. /// </summary>
  35. public string status { get; set; }
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. public string state { get; set; }
  40. /// <summary>
  41. ///
  42. /// </summary>
  43. public List<DataItem> data { get; set; }
  44. }
  45. public class DataItem
  46. {
  47. /// <summary>
  48. ///
  49. /// </summary>
  50. public string time { get; set; }
  51. /// <summary>
  52. ///
  53. /// </summary>
  54. public string ftime { get; set; }
  55. /// <summary>
  56. /// 已签收,感谢使用顺丰,期待再次为您服务
  57. /// </summary>
  58. public string context { get; set; }
  59. /// <summary>
  60. ///
  61. /// </summary>
  62. public string location { get; set; }
  63. }
  64. }

实体类创建好后,我们还需要一个DLL文件,Newtonsoft.Json.DLL,这个文件哪里来呢?很简单,百度一下不就来了。。。。这个DLL的官方网站是:https://www.newtonsoft.com/json

下载下来后,引入,引用(这两个步骤就不需要我教了吧~不懂就百度~)

做完这准备工作后,就进入大家最喜欢的写代码环节了。非常简单,一句代码搞定。自己看吧!

PS,我们接着使用上一篇文章用到的项目,添加一个按钮,在按钮里面写事件。代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using Newtonsoft.Json;
  10. namespace WindowsFormsApplication1
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. private void button1_Click(object sender, EventArgs e)
  19. {
  20. //我们的接口
  21. string url = "http://www.kuaidi100.com/query?type=shunfeng&postid=367847964498";
  22. //将接口传入,这个HttpUitls的类,有兴趣可以研究下,也可以直接用就可以,不用管如何实现。
  23. string getJson = HttpUitls.Get(url);
  24. MessageBox.Show(getJson);
  25. }
  26. private void button2_Click(object sender, EventArgs e)
  27. {
  28. //我们的接口
  29. string url = "http://www.kuaidi100.com/query?type=shunfeng&postid=367847964498";
  30. //将接口传入,这个HttpUitls的类,有兴趣可以研究下,也可以直接用就可以,不用管如何实现。
  31. string getJson = HttpUitls.Get(url);
  32. //这个需要引入Newtonsoft.Json这个DLL并using
  33. //传入我们的实体类还有需要解析的JSON字符串这样就OK了。然后就可以通过实体类使用数据了。
  34. Root rt = JsonConvert.DeserializeObject<Root>(getJson);
  35. //这样就可以取出json数据里面的值
  36. MessageBox.Show("com=" + rt.com + "\r\n" + "condition=" + rt.condition + "\r\n" + "ischeck=" + rt.ischeck + "\r\n" + "state=" + rt.state + "\r\n" + "status=" + rt.status);
  37. //由于这个JSON字符串的 public List<DataItem> data 是一个集合,所以我们需要遍历集合里面的所有数据
  38. for (int i = 0; i < rt.data.Count; i++)
  39. {
  40. MessageBox.Show("Data=" + rt.data[i].context + "\r\n" + rt.data[i].location + "\r\n" + rt.data[i].time + "\r\n" + rt.data[i].ftime);
  41. }
  42. }
  43. }
  44. }

 

 

第三章:C#如何生成JSON字符串?(序列化对象)

上一篇文章中我们讲解了序列号JSON数据,这篇文章我们来讲解一下反序列化JSON数据,也就是将实体类转化成JSON数据,其实也非常简单,说白了,就是将实体初始化。

一样,我们跟着前两篇的代码,在添加 一个按钮,在按钮事件里面写代码。先看效果吧。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using Newtonsoft.Json;
  10. namespace WindowsFormsApplication1
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. private void button1_Click(object sender, EventArgs e)
  19. {
  20. //我们的接口
  21. string url = "http://www.kuaidi100.com/query?type=shunfeng&postid=367847964498";
  22. //将接口传入,这个HttpUitls的类,有兴趣可以研究下,也可以直接用就可以,不用管如何实现。
  23. string getJson = HttpUitls.Get(url);
  24. MessageBox.Show(getJson);
  25. }
  26. private void button2_Click(object sender, EventArgs e)
  27. {
  28. //我们的接口
  29. string url = "http://www.kuaidi100.com/query?type=shunfeng&postid=367847964498";
  30. //将接口传入,这个HttpUitls的类,有兴趣可以研究下,也可以直接用就可以,不用管如何实现。
  31. string getJson = HttpUitls.Get(url);
  32. //这个需要引入Newtonsoft.Json这个DLL并using
  33. //传入我们的实体类还有需要解析的JSON字符串这样就OK了。然后就可以通过实体类使用数据了。
  34. Root rt = JsonConvert.DeserializeObject<Root>(getJson);
  35. //这样就可以取出json数据里面的值
  36. MessageBox.Show("com=" + rt.com + "\r\n" + "condition=" + rt.condition + "\r\n" + "ischeck=" + rt.ischeck + "\r\n" + "state=" + rt.state + "\r\n" + "status=" + rt.status);
  37. //由于这个JSON字符串的 public List<DataItem> data 是一个集合,所以我们需要遍历集合里面的所有数据
  38. for (int i = 0; i < rt.data.Count; i++)
  39. {
  40. MessageBox.Show("Data=" + rt.data[i].context + "\r\n" + rt.data[i].location + "\r\n" + rt.data[i].time + "\r\n" + rt.data[i].ftime);
  41. }
  42. }
  43. private void button3_Click(object sender, EventArgs e)
  44. {
  45. //生成JSON字符串,其实就把我们刚刚写的实体实体赋值
  46. Root rt = new Root();
  47. rt.com="这个是我赋值的com";
  48. rt.condition="这个是我赋值的condition";
  49. rt.ischeck="这个是我赋值的ischeck";
  50. rt.message="这个是我赋值的message";
  51. rt.state="这个是我赋值的satate";
  52. rt.status="这个是我赋值的statcs";
  53. List<DataItem> data =new List<DataItem>();
  54. DataItem dt = new DataItem();
  55. dt.context="这个是我赋值的内容";
  56. dt.time="这个是我赋值的时间";
  57. dt.ftime="这个是我赋值的时间";
  58. data.Add(dt);
  59. rt.data=data;
  60. //把我们初始化好的对象传入即可
  61. string json = JsonConvert.SerializeObject(rt);
  62. MessageBox.Show(json);
  63. }
  64. }
  65. }

 

第四章:C#如何生成JSON字符串提交给接口(服务器)

上一篇文章中我们写的C#生成JSON字符串,那么我们生成的字符串要干嘛呢?当然是将数据提交给服务器啦。一般用过接口来接受这个JSON。

这里我们会用到第一章中的一个 类。HttpUitls里面的Post方法。

非常简单:

  public static string Post(string Url, string Data, string Referer);

  参数说明:URL提交的接口地址

  Data:就是要提交的JSON字符串

 Referer :文件头 ,给个空字符串就可以。

  OK,来到这里,C#操作JSON的日常使用就已经结束了,是不是非常简单!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/861748
推荐阅读
相关标签
  

闽ICP备14008679号