C# 解析“JSON“格式数据和网络实战案例 入门

举报
生产的的驴 发表于 2023/11/29 11:41:12 2023/11/29
【摘要】 实战:前言:解析JSON格式的数据对于爬虫来说非常重要,网页中大部分的接口基本返回的都是这个格式,如果只是想要小部分的数据可以使用字符串的分割,但是一般爬取内容基本不会小部分…如果一直使用字符串分割非常的消耗时间和内存什么是JSON格式?先看看长什么样子这是一个对象格式的数据{ "name": "生产队的驴", "age": "17", "state": "在线", "id": "dpc52...

实战:

前言:

解析JSON格式的数据对于爬虫来说非常重要,网页中大部分的接口基本返回的都是这个格式,如果只是想要小部分的数据可以使用字符串的分割,但是一般爬取内容基本不会小部分…如果一直使用字符串分割非常的消耗时间和内存

什么是JSON格式?
先看看长什么样子

这是一个对象格式的数据

{
	"name": "生产队的驴",
	"age": "17",
	"state": "在线",
	"id": "dpc5201314",
	"phone": "18888888888",	
}

这就是一个简单的JSON格式的数据,当然爬虫一般数据没那么点…

JSON分为两种格式 一种是对象(Objtect),另一种是数组(Array) 不同的格式解析的方法不一样 但大同小异

分辨格式:
分辨格式特别简单
这是看他前面的符号 { } 是对象 ,[ ] 是数组

对象格式:
6cddd610344f4ff081b8cb2fdc574dce_baed671c52644003b3127a371702cdf2.png

数组格式:

{
    "employees": [
        {
            "firstName": "Bill",
            "lastName": "Gates"
        },
        {
            "firstName": "George",
            "lastName": "Bush"
        },
        {
            "firstName": "Thomas",
            "lastName": "Carter"
        }
    ]
}

{ 这是对象 }
[ 这是数组 ]

数组是可以通过下标访问的

JSON结构:
6cddd610344f4ff081b8cb2fdc574dce_baed671c52644003b3127a371702cdf2.png

可以看到他是一个 数型 结构
访问里面的元素结需要 先拿下 树根(employees)然后这得到 树叶(firstName)
上面说到 数组是可以通过下标访问对应的内容


C#解析
简单的介绍了一下他的格式 接下来就是这么使用C#解析他了
需要使用到 Newtonsoft.Json 类库

安装即可

命名空间:

using Newtonsoft.Json.Linq;

记得导入命名空间

对象 和 数组所以的函数不一样
对象:JObject
数组:JArray

JS整理工具:
正常爬虫 返回的数据非常的乱 所以需要搭配JS工具来整理

无从下手

整理后一目了然

在线JS解析工具


对象解析:
首先需要有JSON数据,这里方便演示直接从本地导入…当然正常爬虫是从服务器上获取的…只是为了演示

  StreamReader read = new StreamReader(@"C:\Users\Acer\Desktop\1.txt", Encoding.UTF8);
  //读取文本
string str =read.ReadToEnd();

文本内容

{ } 是对象 使用对象的函数解析,

JObject arr = JObject.Parse(str);
 Console.WriteLine("名字:"+arr["name"]);
  Console.WriteLine("年龄:" + arr["age"]);
  Console.WriteLine("状态:" + arr["state"]);
 Console.WriteLine("账号:" + arr["id"]);
 Console.WriteLine("手机号:" + arr["phone"]);

通过对象 获取他的节点 arr[“age”]

因为不是实战…没难度

数组解析:

这个其实还是一个 对象 里面包含了一个数组 所以需要强制转换

读取JSON:

   StreamReader read = new StreamReader(@"C:\Users\Acer\Desktop\2.txt", Encoding.UTF8);    
        string str =read.ReadToEnd();

强制转格式:

JObject j = JObject.Parse(str);
JArray r = (JArray)j["employees"];
//强制转成数组 因为要获取employees

转换成功后就可以 使用下标去获取 需要的数据了

显示数据:

 Console.WriteLine(r[1]["firstName"]);

第一个[ ]为下标 第二个为 获取哪个节点
615032db7d0141ff14c9cb2d950d4da7_3e91c11ea3624904aeea05fb45559d09.png

如果需要显示全部数据那就可以 使用循环访问下标 获取

 for (int i = 0; i < r.Count; i++)
            {
                Console.WriteLine(r[i]["firstName"]);
            }

08194f04e8cf72fcae81a39e6b46c547_b6783dce0e294ed8b4268255d009217b.png

其他节点也是一样的

for (int i = 0; i < r.Count; i++)
            {
                Console.WriteLine(r[i]["firstName"]);
                Console.WriteLine(r[i]["lastName"]+"\n");
                
            }

5c8eb1c5c6e61eabc5fd52ed74cc551c_7057c2b527054952b9b813fe3c1adafb.png


说那么多 直接加入实战…

某评论区:

数据太乱 去整理
在线JS解析工具

因为JSON是可以嵌套的 当每次想访问哪个节点时 就必须先获取上一个节点

所有的数据都包含 data (树根)上 里还嵌套着 visionCommentList 和 rootComments 其中rootComments 就是他的评论数据 他是一个数组

authorName:用户名
content:评论内容
headurl:用户头像

这是一个对象 先用对象的方式获取他

 JObject j = JObject.Parse(str);

获取嵌套的节点:

string js = j["data"]["visionCommentList"]["rootComments"].ToString();
  JArray r = JArray.Parse(js);
  //剩下的就是 数组 然后使用数组的方式解析

循环下标 显示评论

 for (int i = 0; i < r.Count; i++)
            {
 Console.WriteLine("\n"+r[i]["authorName"]+": "+r[i]["content"]);
            }

总结:
好像都没什么难度,在真正做爬虫的时候 找接口 和 传递的参数才是难点…

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。