C# 处理 json 实战

本贴最后更新于 2401 天前,其中的信息可能已经事过境迁

  昨天看到技术群中发了一个查询天气的 api,http://www.sojson.com/open/api/weather/json.shtml?city=南昌
  点进去看,发现服务器传回来一个天气信息的 json,刚好也在学 C#解析 json,就干脆拿这个作为一个实例了。
  首先,介绍一下 Json:
  Json 其实就是 JavaScript 里面的对象和数组,通过不同的组合,可以构成许多不同的数据结构。其中使用花括号的是对象,中括号的是数组,例如:

{ "data": { "people": [ {"name":"ppppp","age":18} ] } }

  这里面,data 就是一个对象,而 people 就是一个数组。
首先前往 Json 官网下载对应的 dll 文件并应用。这里博主使用的是 LitJson。
首先分析天气查询返回来的 Json 的结构。
Json
  结构和层级很明了。
  上完整 Json:

{ "data": { "yesterday": { "date": "4日星期二", "high": "高温 32℃", "fx": "无持续风向", "low": "低温 25℃", "fl": "微风", "type": "多云" }, "city": "南昌", "aqi": "33", "forecast": [ { "date": "5日星期三", "high": "高温 34℃", "fengli": "微风级", "low": "低温 27℃", "fengxiang": "无持续风向", "type": "多云" }, { "date": "6日星期四", "high": "高温 35℃", "fengli": "微风级", "low": "低温 27℃", "fengxiang": "无持续风向", "type": "晴" }, { "date": "7日星期五", "high": "高温 35℃", "fengli": "微风级", "low": "低温 27℃", "fengxiang": "无持续风向", "type": "多云" }, { "date": "8日星期六", "high": "高温 34℃", "fengli": "微风级", "low": "低温 26℃", "fengxiang": "无持续风向", "type": "多云" }, { "date": "9日星期天", "high": "高温 33℃", "fengli": "微风级", "low": "低温 27℃", "fengxiang": "无持续风向", "type": "多云" } ], "ganmao": "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。", "wendu": "32" }, "status": 200, "message": "OK" }

  分析之后可以知道,data,status,message 属于同一层级,而且 data 和 yesterday 属于对象,forecast 是一个数组。
  LitJson 中有 JsonData 类和 JsonMapper 类,其中 JsonMapper 类用于解析 Json 文本
  具体使用方法如下

JsonData jsonData = JsonMapper.ToObject(Json);//这里会返回JsonData的对象 foreach(JsonData temp in jsonData)//temp中有索引器 { JsonData id = temp["index"] }

在这里我们不去使用索引的方法去获得每一个对应数据,我们使用泛型匹配。
首先需要定义数据类,类成员名必须和 Json 文本内相同

public class Eaxmple { public string A; public string B; public int C; public override string ToString()//必须要重写Tostring { return string.Format("A:{0},B:{1},C:{2}", A, B, C); } }

泛型解析

string json; Eaxmple ex= JsonMapper.ToObject<Eaxmple>(json); Console.WriteLine(ex);

通过以上内容,我们可以对查询天气的 api 进行 Json 解析了。
//定义 Json 类,其中包含一个 data 对象和 status,message

public class JsonContent { public int status { get; set; } public Data data { get; set; } public string message { get; set; } public override string ToString() { return string.Format("status{0},message{1}\n{2}", status, message, data); } } //再定义Data类, public class Data { public string city { get; set; } public string ganmao { get; set; } public string wendu { get; set; } public List<Forecast> forecast { get; set; }//这里的数组我们用集合的方式代替 public override string ToString() { return string.Format("{0}的天气是:\n注意:{1}\n温度{2}", city, ganmao, wendu); } } //最后一个Forecast类 public class Forecast { public string date; public string high; public string fengxiang; public string low; public string fengli; public string type; public override string ToString() { return string.Format("日期:{0},最高气温:{1},最低气温:{2},风向:{3},风力:{4},天气:{5}", date, high, low, fengxiang, fengli, type); } }

这样的话,每一个属性或者字段就和 json 的文本对应上了,我们现在使用 LitJson 解析

//从指定网站获得数据 public static string GetUrlContent(string urladdress) { WebClient MyWebClient = new WebClient(); MyWebClient.Credentials = CredentialCache.DefaultCredentials; Byte[] pageData = MyWebClient.DownloadData(urladdress); string pageHtml = Encoding.UTF8.GetString(pageData); return pageHtml; } static void Main(string[] args) { Console.Write("要查询的城市:"); string City = Console.ReadLine(); string json = GetJson.GetUrlContent(@"http://www.sojson.com/open/api/weather/json.shtml?city=" + City); JsonContent jsonc = JsonMapper.ToObject<JsonContent>(json); Console.WriteLine(jsonc); foreach (var temp in jsonc.data.forecast) { Console.WriteLine(temp); } Console.Read(); }

Json

我的掘金:WarrenRyan

我的简书:WarrenRyan

欢迎关注我的博客获得第一时间更新 https://blog.tity.xyz

我的 Github:StevenEco

  • .NET
    27 引用 • 6 回帖 • 5 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖 • 1 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖 • 1 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    82 引用 • 411 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • AWS
    11 引用 • 28 回帖 • 8 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 74 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • 996
    13 引用 • 200 回帖 • 4 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 661 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 554 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    171 引用 • 1537 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 493 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 156 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    589 引用 • 3528 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 1 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 126 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    115 引用 • 318 回帖
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 4 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 12 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖 • 2 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 107 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 189 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 57 关注