苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 13180|回复: 3

[学生提问] VC#如何用Newtonsoft.Json获取网站接口JSON多层数组数据转换并显示在Listview列表里?

[复制链接]
发表于 2023-3-16 13:36:04 | 显示全部楼层 |阅读模式
本帖最后由 wfr666 于 2023-3-16 13:38 编辑

1232333.jpg
网站接口地址 https://phoile.tender88.com/spor ... 919524&locale=zh_CN


1.png
以上是Json多层数组的数据



[C#] 纯文本查看 复制代码
private void button1_Click(object sender, EventArgs e)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(@"https://phoile.tender88.com/sports-service/sv/odds/events?mk=1&sp=29&ot=2&btg=1&o=1&lg=&ev=&d=&l=100&v=0&me=0&more=false&c=CN&tm=0&g=QQ%3D%3D&pa=0&cl=100&_g=1&pimo=0%2C1%2C8%2C3%2C6%2C7%2C4%2C5&inl=false&_=1671623147061&locale=zh_CN"));
            request.Method = "GET";  //请求的方法
            request.Accept = "application/json, text/javascript, */*; q=0.01"; //可以接受哪些类型的文件
            request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9"); //头部信息添加语言
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"; //访问验证
            request.ContentType = "application/json;charset=UTF-8"; //识别编码格式UTF-8
            HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //响应,强制转换
            Stream myResponseStream = response.GetResponseStream();   //获取流,需要引用命名空间IO
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);  //流读取器,观察者模式

textBox1.Text = myStreamReader.ReadToEnd();   //读取放到text里(我想让JSON数组里的数据显示在Listview列表里)



  myStreamReader.Close();     //关闭
            myStreamReader.Dispose();   //释放
            myResponseStream.Close();   //关闭流
            myResponseStream.Dispose(); //释放流


?





以下代码编译不成功,不知道是不是要在类单元里定义实体类


1、使用Newtonsoft.Json的DeserializeObject方法将json字符串反序列化为对象:
string json = "";  //json字符串
var result = JsonConvert.DeserializeObject<List<Dictionary<string,string>>>(json);

2、使用foreach循环遍历每一层的[]中括号内的数据,将其加入到字符串中:
string str = "";
foreach (var item1 in result)
{
    foreach (var item2 in item1)
    {
        str +=item2.Key +":"+item2.Value;
    }
}

3、将获取到的字符串赋值给text控件:
text.Text = str;





VC#如何用Newtonsoft.Json获取[]中括号内多层[]中括号里的数据并显示在Listview列表里(因为网站接口每天的JSON数据都不一样,难道要
使用Newtonsoft.Json的DeserializeObject方法将json字符串反序列化为对象)有没有大神指点指点?一起交流互相学习.



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2023-3-18 10:03:49 | 显示全部楼层
解析JSon的关键在于定义出对应的对象,然后直接反序列化就行了。

而这个可以用我的工具直接根据Json串生成对应的类

http://tool.sufeinet.com/Creater/JsonClassGenerator.aspx

 楼主| 发表于 2023-3-19 15:30:11 | 显示全部楼层
站长苏飞 发表于 2023-3-18 10:03
解析JSon的关键在于定义出对应的对象,然后直接反序列化就行了。

而这个可以用我的工具直接根据Json串生 ...

[C#] 纯文本查看 复制代码
using System;  
using JsonCSharpClassGenerator;  
  
namespace SufeiNet  
{  
  
    public class SufeiNet_Test  
    {  
  
        public SufeiNet_Test(string json)  
            : this(JObject.Parse(json))  
        {  
        }  
  
        private JObject __jobject;  
        public SufeiNet_Test(JObject obj)  
        {  
            this.__jobject = obj;  
        }  
  
        public object u  
        {  
            get  
            {  
                return JsonClassHelper.ReadObject(JsonClassHelper.GetJToken<JToken>(__jobject, "u"));  
            }  
        }  
  
        [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]  
        private object[][] _l;  
        public object[][] l  
        {  
            get  
            {  
                if (_l == null)  
                    _l = (object[][])JsonClassHelper.ReadArray<object>(JsonClassHelper.GetJToken<JArray>(__jobject, "l"), JsonClassHelper.ReadObject, typeof(object[][]));  
                return _l;  
            }  
        }  
  
        [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]  
        private object[][] _n;  
        public object[][] n  
        {  
            get  
            {  
                if (_n == null)  
                    _n = (object[][])JsonClassHelper.ReadArray<object>(JsonClassHelper.GetJToken<JArray>(__jobject, "n"), JsonClassHelper.ReadObject, typeof(object[][]));  
                return _n;  
            }  
        }  
  
        public object e  
        {  
            get  
            {  
                return JsonClassHelper.ReadObject(JsonClassHelper.GetJToken<JToken>(__jobject, "e"));  
            }  
        }  
  
        public int lg  
        {  
            get  
            {  
                return JsonClassHelper.ReadInteger(JsonClassHelper.GetJToken<JValue>(__jobject, "lg"));  
            }  
        }  
  
        public int pt  
        {  
            get  
            {  
                return JsonClassHelper.ReadInteger(JsonClassHelper.GetJToken<JValue>(__jobject, "pt"));  
            }  
        }  
  
        public object ps  
        {  
            get  
            {  
                return JsonClassHelper.ReadObject(JsonClassHelper.GetJToken<JToken>(__jobject, "ps"));  
            }  
        }  
  
        public object d  
        {  
            get  
            {  
                return JsonClassHelper.ReadObject(JsonClassHelper.GetJToken<JToken>(__jobject, "d"));  
            }  
        }  
  
    }  
  
}  
// JSON C# Class Generator  
// [url]http://www.sufeinet.com/[/url]  
  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using Newtonsoft.Json.Linq;  
  
namespace JsonCSharpClassGenerator  
{  
    internal static class JsonClassHelper  
    {  
  
        public static T GetJToken<T>(JObject obj, string field) where T : JToken  
        {  
            JToken value;  
            if (obj.TryGetValue(field, out value)) return GetJToken<T>(value);  
            else return null;  
        }  
  
        private static T GetJToken<T>(JToken token) where T : JToken  
        {  
            if (token == null) return null;  
            if (token.Type == JTokenType.Null) return null;  
            if (token.Type == JTokenType.Undefined) return null;  
            return (T)token;  
        }  
  
        public static string ReadString(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) return null;  
            return (string)value.Value;  
        }  
  
  
        public static bool ReadBoolean(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) throw new Newtonsoft.Json.JsonSerializationException();  
            return Convert.ToBoolean(value.Value);  
  
        }  
  
        public static bool? ReadNullableBoolean(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) return null;  
            return Convert.ToBoolean(value.Value);  
        }  
  
  
        public static int ReadInteger(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) throw new Newtonsoft.Json.JsonSerializationException();  
            return Convert.ToInt32((long)value.Value);  
  
        }  
  
        public static int? ReadNullableInteger(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) return null;  
            return Convert.ToInt32((long)value.Value);  
  
        }  
  
  
  
        public static long ReadLong(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) throw new Newtonsoft.Json.JsonSerializationException();  
            return Convert.ToInt64(value.Value);  
  
        }  
  
        public static long? ReadNullableLong(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) return null;  
            return Convert.ToInt64(value.Value);  
        }  
  
  
        public static double ReadFloat(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) throw new Newtonsoft.Json.JsonSerializationException();  
            return Convert.ToDouble(value.Value);  
  
        }  
  
        public static double? ReadNullableFloat(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) return null;  
            return Convert.ToDouble(value.Value);  
  
        }  
  
  
  
  
        public static DateTime ReadDate(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) throw new Newtonsoft.Json.JsonSerializationException();  
            return Convert.ToDateTime(value.Value);  
  
        }  
  
        public static DateTime? ReadNullableDate(JToken token)  
        {  
            var value = GetJToken<JValue>(token);  
            if (value == null) return null;  
            return Convert.ToDateTime(value.Value);  
  
        }  
  
        public static object ReadObject(JToken token)  
        {  
            var value = GetJToken<JToken>(token);  
            if (value == null) return null;  
            if (value.Type == JTokenType.Object) return value;  
            if (value.Type == JTokenType.Array) return ReadArray<object>(value, ReadObject);  
  
            var jvalue = value as JValue;  
            if (jvalue != null) return jvalue.Value;  
  
            return value;  
        }  
  
        public static T ReadStronglyTypedObject<T>(JToken token) where T : class  
        {  
            var value = GetJToken<JObject>(token);  
            if (value == null) return null;  
            return (T)Activator.CreateInstance(typeof(T), new object[] { token });  
  
        }  
  
  
        public delegate T ValueReader<T>(JToken token);  
  
  
  
        public static T[] ReadArray<T>(JToken token, ValueReader<T> reader)  
        {  
            var value = GetJToken<JArray>(token);  
            if (value == null) return null;  
  
            var array = new T[value.Count];  
            for (int i = 0; i < array.Length; i++)  
            {  
                array[i] = reader(value[i]);  
            }  
            return array;  
  
        }  
  
  
  
        public static Dictionary<string, T> ReadDictionary<T>(JToken token)  
        {  
            var value = GetJToken<JObject>(token);  
            if (value == null) return null;  
    
                var dict = new Dictionary<string, T>();  
  
                return dict;  
        }  
  
        public static Array ReadArray<K>(JArray jArray, ValueReader<K> reader, Type type)  
        {  
            if (jArray == null) return null;  
  
            var elemType = type.GetElementType();  
  
            var array = Array.CreateInstance(elemType, jArray.Count);  
            for (int i = 0; i < array.Length; i++)  
            {  
                if (elemType.IsArray)  
                {  
                    array.SetValue(ReadArray<K>(GetJToken<JArray>(jArray[i]), reader, elemType), i);  
                }  
                else  
                {  
                    array.SetValue(reader(jArray[i]), i);  
                }  
  
            }  
            return array;  
  
        }  
    }  
} 




我想问下转换C#实体类,那么网站接口每天的JSON数据都不一样,不就是要每天都要在C#实体类里修改后编译一次程序才能访问该网站接口的JSON数据?能否让程序接收JSON每天不一样的数据?
发表于 2023-3-20 10:10:07 | 显示全部楼层
wfr666 发表于 2023-3-19 15:30
[mw_shl_code=csharp,true]using System;  
using JsonCSharpClassGenerator;  
  

每天的都不一样应该是有规律的吧,或者是你写一个全部参数的,不够的不填就行了。如果真是必须变化,而且每天的差别特别大,那就使用动态类型
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-25 02:42

© 2014-2021

快速回复 返回顶部 返回列表