欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# 解析获取到JSON

程序员文章站 2022-06-12 17:02:32
...

此处用到了 Newtonsoft.Json 这个DLL文件.因为里面已经封装了很多方法.
具体下载地址 : http://files.cnblogs.com/cgdou/Json50r8.zip

里面包含了.NET 框架的各个版本.这里,我用到的是 .NET 4.0

解析JSON有两种方式,下面将会把代码贴出来.

先导入命名空间:

using Newtonsoft.Json;
using System.Web;
using Newtonsoft.Json.Linq;

第一种方法:

  反序列化JSON字符串,将JSON字符串转换成LIST列表   

  先定义一个类,类中变量和返回的JSON字段值一样:

  

 public class Customer
    {
 
        //在序列化前后没有变动     
        public string Productid
        { get; set; }
        //在序列化前后设置和重置     
        public string Productname
        { get; set; }
        //设置为null,但在序列化后填充     
        public string Price
        { get; set; }
         public string num
        { get; set; }
        //设置为null,但在序列化后填充     
        public string url
        { get; set; }

        public string Other
        { get; set; }
        public Customer()
        {
            //     
            //TODO: 在此处添加构造函数逻辑     
            //     
            Productid = "";
            Productname = "";
            Price = "";
            num = "";
            url = "";
            Other = null;
        }
    }  

  然后是解析的方法:

        void GetListJson()
        {
           // string jsonText = "[{'Productid':'1','Productname': '手机','Price':25.5,'num': 1000,'url':'http://www.baidu.com'}]";
            string jsonText = "[{\"Productid\":1,\"Productname\": \"手机\",\"Price\":25.5,\"num\": 1000,\"url\":\"http://www.baidu.com\"}]";
            List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);
            //读取列表中的值   
            // Console.WriteLine(_list[1].status);

            for (int i = 0; i < _list.Count; i++)
            {
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("Productid: " + _list[i].Productid);
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("Productname: " + _list[i].Productname);
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("Price: " + _list[i].Price);
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("num: " + _list[i].num);
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("url: " + _list[i].url);
            }
        }

  以后是第一 种,解析比较简单的JSON可以,但如果碰到JSON里面嵌套JSON的情况是,就要用下面这种方法:

 String jsonText = "[{\"status\":\"1\",\"postPrice\":[{\"Productid\":1,\"Productname\": \"手机\",\"Price\":25.5,\"num\": 1000,\"url\":\"http://www.baidu.com\"}]}]";

  方法如下:

  

        void GetJArryJson()
        {

            String jsonText = "[{\"status\":\"1\",\"postPrice\":[{\"Productid\":1,\"Productname\": \"手机\",\"Price\":25.5,\"num\": 1000,\"url\":\"http://www.baidu.com\"}]}]";

            JArray jsonarray = (JArray)JsonConvert.DeserializeObject(jsonText);

            JArray onearray = null;

            for (int i = 0; i < jsonarray.Count; i++)
            {
                TXT_Info.AppendText("\t\n");
                JObject jsonobject = (JObject)jsonarray[0];
                TXT_Info.AppendText("status: " + jsonobject["status"].ToString());
                TXT_Info.AppendText("\t\n");
                onearray = (JArray)jsonobject["postPrice"];
                for (int j = 0; j < onearray.Count; j++)
                {
                    TXT_Info.AppendText("postPrice: ");
                    TXT_Info.AppendText("\t\n");
                    JObject oneobject = (JObject)(onearray[0]);

                    TXT_Info.AppendText("\tProductid: " + oneobject["Productid"].ToString());
                    TXT_Info.AppendText("\t\n");
                    TXT_Info.AppendText("\tProductname: " + oneobject["Productname"].ToString());
                    TXT_Info.AppendText("\t\n");
                    TXT_Info.AppendText("\tPrice: " + oneobject["Price"].ToString());
                    TXT_Info.AppendText("\t\n");
                    TXT_Info.AppendText("\tnum: " + oneobject["num"].ToString());
                    TXT_Info.AppendText("\t\n");
                    TXT_Info.AppendText("\turl: " + oneobject["url"].ToString());
                    TXT_Info.AppendText("\t\n");
                }

            }
        }

  这样.基本上就可以将返回来的JSON进行解析了.

  下面是一种生产环境下会碰到的情况,调用远程REST来获取JSON:

  方法如下,这里使用了第一种方法,将JSON转到List:

  

        void GetCityListJson(String Pcode)
        {
            HttpURL = "http://localhost:8060/MyRest/CommonMethodResource/jsonCity/" + Pcode;
            urlvalue = HttpWebResponseUtility.CreateGetHttpResponse(HttpURL, null, null, null, "utf-8");
            // 开始获取REST的加密信息
            if (urlvalue.Length > 5)
            {
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("获取值成功");
            }
            else
            {
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("获取值失败");
                return;
            }

            List<JsonCity> _list = JsonConvert.DeserializeObject<List<JsonCity>>(urlvalue);
            //读取列表中的值   
            // Console.WriteLine(_list[1].status);

            for (int i = 0; i < _list.Count; i++)
            {
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("City_Code: " + _list[i].City_Code);
                TXT_Info.AppendText("\t\n");
                TXT_Info.AppendText("City: " + _list[i].City);
            }
        }

  相对应的类:

    public class JsonCity
    {

        //在序列化前后没有变动     
        public string City_Code
        { get; set; }
        //在序列化前后设置和重置     
        public string City
        { get; set; }

        public JsonCity()
        {
            //     
            //TODO: 在此处添加构造函数逻辑     
            //     
            City_Code = "";
            City = "";

        }
    }  

  以下是我解析HTTP请求用到的类文件:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions;  


namespace REST
{
    class HttpWebResponseUtility
    {
        private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        /// <summary>   
        /// 创建GET方式的HTTP请求   
        /// </summary>   
        /// <param name="url">请求的URL</param>   
        /// <param name="timeout">请求的超时时间</param>   
        /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>   
        /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>   
        /// <returns></returns>   
        public static string CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies, string type)
        {
            try
            {
                if (string.IsNullOrEmpty(url))
                {
                    throw new ArgumentNullException("url");
                }
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Method = "GET";
                request.UserAgent = DefaultUserAgent;
                if (!string.IsNullOrEmpty(userAgent))
                {
                    request.UserAgent = userAgent;
                }
                if (timeout.HasValue)
                {
                    request.Timeout = timeout.Value;
                }
                if (cookies != null)
                {
                    request.CookieContainer = new CookieContainer();
                    request.CookieContainer.Add(cookies);
                }
                System.IO.Stream respStream = (request.GetResponse() as HttpWebResponse).GetResponseStream();
                using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type)))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (System.Exception ex)
            {
                //errorMsg = ex.Message;
            }
            return "";
        }
        /// <summary>   
        /// 创建POST方式的HTTP请求   
        /// </summary>   
        /// <param name="url">请求的URL</param>   
        /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>   
        /// <param name="timeout">请求的超时时间</param>   
        /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>   
        /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>   
        /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>   
        /// <returns></returns>   
        public static string CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout,
            string userAgent, Encoding requestEncoding, CookieCollection cookies, string type)
        {
            try
            {
                if (string.IsNullOrEmpty(url))
                {
                    throw new ArgumentNullException("url");
                }
                if (requestEncoding == null)
                {
                    throw new ArgumentNullException("requestEncoding");
                }
                HttpWebRequest request = null;
                //如果是发送HTTPS请求   
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                    request = WebRequest.Create(url) as HttpWebRequest;
                    request.ProtocolVersion = HttpVersion.Version10;
                }
                else
                {
                    request = WebRequest.Create(url) as HttpWebRequest;
                }
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";

                if (!string.IsNullOrEmpty(userAgent))
                {
                    request.UserAgent = userAgent;
                }
                else
                {
                    request.UserAgent = DefaultUserAgent;
                }

                if (timeout.HasValue)
                {
                    request.Timeout = timeout.Value;
                }
                if (cookies != null)
                {
                    request.CookieContainer = new CookieContainer();
                    request.CookieContainer.Add(cookies);
                }
                //如果需要POST数据   
                if (!(parameters == null || parameters.Count == 0))
                {
                    StringBuilder buffer = new StringBuilder();
                    int i = 0;
                    foreach (string key in parameters.Keys)
                    {
                        if (i > 0)
                        {
                            buffer.AppendFormat("&{0}={1}", key, parameters[key]);
                        }
                        else
                        {
                            buffer.AppendFormat("{0}={1}", key, parameters[key]);
                        }
                        i++;
                    }
                    byte[] data = requestEncoding.GetBytes(buffer.ToString());
                    using (Stream stream = request.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }
                System.IO.Stream respStream = (request.GetResponse() as HttpWebResponse).GetResponseStream();
                using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type)))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (System.Exception ex)
            {
                //errorMsg = ex.Message;
            }
            return "";
        }

        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受   
        }  

    }
}

  以上,就是我用来解析 JSON 的方法了.