怎么在.net里面解析JSON文件?
我在网上搜了好多的文章,讲了很多的方法。但是无一例外的都看不懂...可能是因为我在这方面是个白痴吧...
所幸的是,我搜到了一个博客,写的很是清晰,比我之前看的大片文章写的好多了,在这里:http://blog.csdn.net/miaozhenzhong/article/details/52585726
写这篇文章的大佬也不知道是谁,反正甚是感谢。
看了上面十分清晰的文章之后,在.net里面是没有办法使用JsonObject的怎么办?
在这里再次感谢另一位大佬,他自己写了一个dll文件,可以添加到.net里面,在这里:
http://blog.csdn.net/cc_want/article/details/50577298 这个大佬可以确定了,在他的文章下方有dll的连接,大家去下载那个github上面的就好了。
感谢这两个大佬,我不用整理文章了,也写不出比上面更好的文章了。
把一个对象给序列化成json文件,下面这行代码:
string result = JsonConvert.SerializeObject(obj, Formatting.Indented);
obj就是一个object类型的对象,后面那个Formatting.Indented就是让输出的格式更好看整洁...
--------------------------------------为了防止文章流失,那位不知名大佬的文章我保存在这里了.....勿怪.....----------------------------------
JSON简介
- JAVAScript Object Notation是一种轻量级的数据交换格式
- 具有良好的可读和便于快速编写的特性。
- 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
- JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
- JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强
JSON支持的数据类型
我们要学习使用JSON解析,必须对JSON解析的规则原理有深刻的认识和了解,然后才知道它的一个实现原理
JSON里面的数据是以一种键值对的方式存在
(”key”:”value”)中值的类型可以是下面数据类型中的任意一种:
1. 数字(整数或浮点数)
2. 逻辑值(true 或 false)
3. 字符串(在双引号中)
4. 数组(在方括号中)
5. 函数
6. 对象(在大括号中)
7. null
JSON语法规则
JSON的语法规则非常的简单,就是使用
大括号’{}’,
中括号’[]’,
逗号’,’,
冒号’:’,
双引号’“”’。
数据类型:
嵌套对象、数组、字符串、数字、布尔值或空值。
我们在JSON解析中只有三中情况出现
1.{} 解析’大括号’类型
2. [ ] 解析是’中括号’类型
3. 其实只有两种,那第三种则是1与2的组合方法即”{’name’:’李书豪’ ,’hobby’:[‘编程’,’电竞’,’睡觉’]}”那么下面分别来看一些这三种类型以及解析
JSON基本语法与图例
- Object(对象类型)
- 用{ }包含一系列无序的key–Value键值对表示,其中Key和Value之间用冒号分割,每个key-value之间用逗号分割。
- 比如:
- Array(数组类型)
- 使用[ ]包含所有元素,每个元素用逗号分隔,元素可以是任意的值
- 比如:
- 组合形
JSON数据解析
JSON解析一定要掌握的两条规则:
- 1.如果看到是{ }–>使用JSONObject
- 2.如果看到的[ ]–>使用JSONArray解析
掌握了JSON的数据类型和基本语法后,下面我们将对JSON的各种语法类型进行详细解析(注意掌握两条规则的使用,掌握了JSON解析就那么回事)
纯对象(Object)的解析{ }:
- import org.json.JSONException;
- import org.json.JSONObject;
- /**
- * JSON-->纯对象(Object)的解析
- *
- * 注:我们在eclipse里面操作JSON解析的时候需要第三方jar包的支持
- * @author sKy°
- * @date 2016-5-8
- * @version 1.0
- */
- public class Json01 {
- public static void main(String[] args) {
- // 编辑一个我们要解析的数据对象
- // 根据JSON的官方定义,键,加"",值,如果是字符串,就加"",其他不加。
- String json="{'name':'李书豪','age':24}";
- try {
- // 创建JSON解析对象(两条规则的体现:大括号用JSONObject,注意传入数据对象)
- JSONObject obj = new JSONObject(json);
- // obj.后面有各种数据类型,根据对象来选择使用的数据类型
- String name = obj.getString("name");
- // 同理如上,这里的age为Int类型,我们就用对应的类型进行解析
- int age = obj.getInt("age");
- // 最后输出到控制台
- System.out.println(name+"<--->"+age);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- }
纯数组(Array)的解析{ }:
- import org.json.JSONArray;
- import org.json.JSONException;
- /**
- * 对纯数组Aarry的解析
- * @author sKy°
- * @date 2016-5-8
- * @version 1.0
- */
- public class Json02 {
- public static void main(String[] args) {
- // 编辑一个我们要解析的数据对象
- String json="['天津冷','北京暖','东京热','南京凉']";
- try {
- // 创建JSON解析对象(两条规则的体现:中括号用JSONArray,注意传入数据对象)
- JSONArray jArray = new JSONArray(json);
- // 取得数组长度
- int length = jArray.length();
- // 回想数组的取值的方式? --->for循环遍历数组--->得到值
- for (int i = 0; i < length; i++) {
- // 根据解析的数据类型使用该类型的get方法得到该值,打印输出
- String string = jArray.getString(i);
- System.out.print(string+",");
- }
- } catch (JSONException e) {
- // TODO: handle exception
- }
- }
- }
组合类型的解析(一):
- 例子: String json=”{‘name’:’李书豪’,’girlFriend’:{‘name’:’高圆圆’,’age’:18}}”;
- 分析: 我们首先是解析外面的大括号的对象,然后,通过girlfFriend,获取到对应的被包含的里面大括号对象。所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值
- /**
- * 创建一个Person用于接收解析数据,封装对应字段
- * @author sKy°
- * @date 2016-5-8
- * @version 1.0
- */
- public class Person {
- // 分析我们要解析的对象,根据解析对象的属性值去创建对应的属性值
- // 根据分析我们所要解析的对象,两条属性 1.name(String类型) 2.是girlFrien(类类型,意味着还需要在类中去嵌套一个类(创建类部类也可))
- // 封装字段
- private String name;
- private GirlFriend girlFriend; //类类型
- // setter getter方法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public GirlFriend getGirlFriend() {
- return girlFriend;
- }
- public void setGirlFriend(GirlFriend girlFriend) {
- this.girlFriend = girlFriend;
- }
- // toString方法用于控制台输出
- @Override
- public String toString() {
- return "Person [name=" + name + ", girlFriend=" + girlFriend + "]";
- }
- }
- // 为了方便咱们看,这里就直接在下面创建了一个GirlFriend这个类
- class GirlFriend{
- // 根据对象属性值,创建对应的值
- private String name;
- private int age;
- // setter getter方法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- // toString方法用于控制台输出
- @Override
- public String toString() {
- return "GirlFriend [name=" + name + ", age=" + age + "]";
- }
- }
开始解析:
- import org.json.JSONException;
- import org.json.JSONObject;
- /**
- * 组合数据类型的解析--->对象嵌套对象类型
- * @author sKy°
- * @date 2016-5-8
- * @version 1.0
- */
- public class Json03 {
- public static void main(String[] args) {
- // 编辑一个我们要解析的数据对象
- // 分析: 应该先解析外面的大的对象,然后,通过girlfFriend,获取到对应的被包含的对象。
- // 所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值
- String json="{'name':'李书豪','girlFriend':{'name':'高圆圆','age':18}}";
- try {
- // 1.创建JSON解析对象(两条规则的提现:大括号用JSONObject,注意传入数据对象)
- JSONObject jObj = new JSONObject(json);
- // 2.实例化Person对象获取对应的值--->这里是获得外面大括号{}的name值 思考?里面{}如何获得?
- Person per=new Person();
- String name = jObj.getString("name");
- per.setName(name);
- // 3.分析:里面{}是嵌套在外面大括号类的所以我们解析的对象是通过外面大括号去取得里面大括号值,注意看
- //取得对应里面大括号的girlFriend,取得name值,赋值给girlFriend对象
- GirlFriend girlFriend=new GirlFriend();
- JSONObject jObj1 = jObj.getJSONObject("girlFriend");
- String gfName = jObj1.getString("name");
- girlFriend.setName(gfName);
- // 获得age值并赋值
- int gfAge = jObj1.getInt("age");
- girlFriend.setAge(gfAge);
- // 通过set把girlFriend的值赋Person 用于toString的输出,不然为空
- per.setGirlFriend(girlFriend);
- // 输出
- System.out.println(per);
- }catch (JSONException e) {
- e.printStackTrace();
- }
- }
- }
小结: {[ {},{} ]}–>思路:第一步看到大括号:JSONObject去解,创建好对应里面的属性的值;第二步看到中括号:JSONArray去解析 对应创建好对应里面的属性值;第三步中括号里面的{},又是一个JSONObject。思路大致如此,强调注意的是,设置的属性值setXxx getXxx必须要和去获得值名称一致,不然会出错!!
组合类型的解析(二):
下面我们来解析一个略为复杂的JSON数据
要解析的数据如下:
- {
- 'desc': 'OK',
- 'status': 1000,
- 'data': {
- 'wendu': '20',
- 'ganmao': '相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。',
- 'forecast': [
- {
- 'fengxiang': '北风',
- 'fengli': '3-4级',
- 'high': '高温 27℃',
- 'type': '中雨',
- 'low': '低温 19℃',
- 'date': '6日星期五'
- },
- {
- 'fengxiang': '北风',
- 'fengli': '微风级',
- 'high': '高温 23℃',
- 'type': '大雨',
- 'low': '低温 17℃',
- 'date': '7日星期六'
- },
- {
- 'fengxiang': '北风',
- 'fengli': '微风级',
- 'high': '高温 26℃',
- 'type': '小雨',
- 'low': '低温 17℃',
- 'date': '8日星期天'
- },
- {
- 'fengxiang': '南风',
- 'fengli': '微风级',
- 'high': '高温 27℃',
- 'type': '多云',
- 'low': '低温 15℃',
- 'date': '9日星期一'
- },
- {
- 'fengxiang': '南风',
- 'fengli': '微风级',
- 'high': '高温 29℃',
- 'type': '多云',
- 'low': '低温 16℃',
- 'date': '10日星期二'
- }
- ],
- 'yesterday': {
- 'fl': '微风',
- 'fx': '北风',
- 'high': '高温 33℃',
- 'type': '阴',
- 'low': '低温 22℃',
- 'date': '5日星期四'
- },
- 'aqi': '58',
- 'city': '成都'
- }
- }
因为数据略大,不方便咱们看,这里给大家提供一个JSON在线解析工具http://json.phpddt.com/ 这是JSON在线高亮解析 ,可以很好的帮助咱们进行解析分析。下面是我用网页解析好的图片,可以思考下步骤(记住两条规则)
分析:
一:第一个大括号(JSONObject){”desc”: “status”: “data”}
二:大括号里面有一个大括号(JSONObject){”wendu”: “20”, “ganmao”: “forecast”: “yesterday”: “aqi”: “city”: }
三:第二个大括号里面有两个对象 1.数组形(JSONArray) 2.对象形( JSONObject )
而数组形里面又套有数组的对象{} 。这就需要咱们在解析的时候需要很细致的去创建对应的属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!
开始封装字段:
- import java.util.List;
- /**
- * 对应的字段的封装
- * @author sKy°
- * @date 2016-5-6
- * @version 1.0
- */
- public class Weather {
- // 外面大括号的字段封装 setter getter toString
- public String desc;
- public int status;
- public Data data;
- @Override
- public String toString() {
- return "Weather [desc=" + desc + ", status=" + status + ", data="
- + data + "]";
- }
- }
- class Data{
- // 里面大括号的字段封装 setter getter toString
- // 该类中包含有数组形和对象形,需要一并的封装在里面
- public String wendu;
- public String ganmao;
- public List<Forecast> forecast;
- public Yesterday yesterday;
- public String aqi;
- public String city;
- @Override
- public String toString() {
- return "Data [wendu=" + wendu + ", ganmao=" + ganmao + ", forecast="
- + forecast + ", yesterday=" + yesterday + ", aqi=" + aqi
- + ", city=" + city + "]";
- }
- }
- class Forecast{
- // 数组里面的大括号类型字段的封装
- public String fengxiang;
- public String fengli;
- public String high;
- public String type;
- public String low;
- public String date;
- @Override
- public String toString() {
- return "Forecast [fengxiang=" + fengxiang + ", fengli=" + fengli
- + ", high=" + high + ", type=" + type + ", low=" + low
- + ", date=" + date + "]";
- }
- }
- class Yesterday{
- // 最后{}的字段封装
- public String fl;
- public String fx;
- public String high;
- public String type;
- public String low;
- public String date;
- @Override
- public String toString() {
- return "Yesterday [fl=" + fl + ", fx=" + fx + ", high=" + high
- + ", type=" + type + ", low=" + low + ", date=" + date + "]";
- }
- }
开始解析:
- import java.util.ArrayList;
- import java.util.List;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
- /**
- * 组合类型二的解析
- * @author sKy°
- * @date 2016-5-6
- * @version 1.0
- */
- public class Test01 {
- public static void main(String[] args) throws Exception {
- //要解析的对象
- String json="{ 'desc': 'OK', 'status': 1000, 'data': { 'wendu': '20', 'ganmao': '相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。', 'forecast': [ { 'fengxiang': '北风', 'fengli': '3-4级', 'high': '高温 27℃', 'type': '中雨', 'low': '低温 19℃', 'date': '6日星期五' }, { 'fengxiang': '北风', 'fengli': '微风级', 'high': '高温 23℃', 'type': '大雨', 'low': '低温 17℃', 'date': '7日星期六' }, { 'fengxiang': '北风', 'fengli': '微风级', 'high': '高温 26℃', 'type': '小雨', 'low': '低温 17℃', 'date': '8日星期天' }, { 'fengxiang': '南风', 'fengli': '微风级', 'high': '高温 27℃', 'type': '多云', 'low': '低温 15℃', 'date': '9日星期一' }, { 'fengxiang': '南风', 'fengli': '微风级', 'high': '高温 29℃', 'type': '多云', 'low': '低温 16℃', 'date': '10日星期二' } ], 'yesterday': { 'fl': '微风', 'fx': '北风', 'high': '高温 33℃', 'type': '阴', 'low': '低温 22℃', 'date': '5日星期四' }, 'aqi': '58', 'city': '成都' } }";
- Weather wea=new Weather();
- // 首先看到的是一个{}所以用JSON Object来进行解析
- // 获得外部的Weather
- JSONObject obj = new JSONObject(json);
- String desc = obj.getString("desc");
- int status = obj.getInt("status");
- wea.status=status;
- wea.desc=desc;
- // 获得内部Data的数据
- JSONObject obj1 = obj.getJSONObject("data");
- Data data=new Data();
- data.wendu=obj1.getString("wendu");
- data.ganmao=obj1.getString("ganmao");
- data.aqi=obj1.getString("aqi");
- data.city=obj1.getString("city");
- wea.data=data;
- List<Forecast> forecasts=new ArrayList<>();
- // 获取forecast数组
- JSONArray jArr = obj1.getJSONArray("forecast");
- for (int i = 0; i < jArr.length(); i++) {
- JSONObject obj2 = jArr.getJSONObject(i);
- Forecast forecast=new Forecast();
- forecast.date=obj2.getString("date");
- forecast.fengxiang=obj2.getString("fengxiang");
- forecast.high=obj2.getString("high");
- forecast.low=obj2.getString("low");
- forecast.fengli=obj2.getString("fengli");
- forecast.type=obj2.getString("type");
- forecasts.add(forecast);
- }
- data.forecast=forecasts;
- JSONObject obj3 = obj1.getJSONObject("yesterday");
- Yesterday yesterday=new Yesterday();
- yesterday.fl=obj3.getString("fl");
- yesterday.fx=obj3.getString("fx");
- yesterday.high=obj3.getString("high");
- yesterday.type=obj3.getString("type");
- yesterday.low=obj3.getString("low");
- yesterday.date=obj3.getString("date");
- data.yesterday=yesterday;
- // 输出字段
- System.out.println(wea);
- }
解析结果:
结语: 对于JSON解析个人的粗浅看法,
1.首先是对JSON数据的一个分析
2.其次是掌握JSON一些技巧(两条规则–对象形JSONObject ,数组形JSONArray)
3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)
4.而后是解析中要有明确的思路
(以上只是一个JSON初步的解析,但JSON解析的大致思路如此,后面有http套用的,无非也就把下载的文件转为JSON对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)
怎么在.net里面解析JSON文件?的更多相关文章
- Android--------使用gson解析json文件
##使用gson解析json文件 **json的格式有两种:** **1. {}类型,及数据用{}包含:** **2. []类型,即数据用[]包含:** 下面用个例子,简单的介绍gson如何解析jso ...
- JAVA简便解析json文件
JAVA简便解析json文件 首先放上我要解析的json文件: { "resultcode":"200", "reason":"S ...
- python脚本解析json文件
python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...
- 使用google-gson类库解析json文件
使用google-gson类库解析json文件 使用JsonParser解析器来解析字符串和输入流,变成json对象 代码如下: public class Readjson { public stat ...
- 安卓解析JSON文件
安卓解析JSON文件 根据JOSN文件的格式,文件只有两种数据,一是对象数据,以 {}为分隔,二是数组,以[]分隔 以下介绍安卓如何解析一个JSON文件,该文件存放在assets目录下,即:asset ...
- Java解析JSON文件的方法
http://blog.sina.com.cn/s/blog_628cc2b70101dydc.html java读取文件的方法 http://www.cnblogs.com/lovebread/ar ...
- Logstash:解析 JSON 文件并导入到 Elasticsearch 中
转载自:https://elasticstack.blog.csdn.net/article/details/114383426 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON ...
- C#解析json文件的方法
C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...
- Java解析JSON文件的方法(一)
一.首先需要在Eclipse工程中导入相关的jar包,jar包参见链接:http://yunpan.alibaba-inc.com/share/link/NdA5b6IFK 二.提供一份待解析的jso ...
- 解析Json文件
一: /** * 把json文件读取到内存中 * * @throws IOException */ public String getFile(String filePath) throws IOEx ...
随机推荐
- 常用算法Java实现之希尔排序
希尔排序严格来说是基于插入排序的思想,又被称为缩小增量排序. 具体流程如下: 1.将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对... 2.对每对数据进行比较和交换, ...
- iOS自学-混合编程
OC调用swift,引入头文件 #improt "工程名字-swift.h" swift调用OC,在桥梁文件里面引入OC文件 的头文件 尽情混合编程吧...
- Alpha版会议总结
目前的进度: 实现了文字备忘的录入: 实现了提醒功能: 实现了可视化界面: 语音录入功能还没有完成: 界面相当粗糙: 遇到的问题: 语音录入按钮按下后没有反应,目前没有解决思路和方法. 原本的解屏功能 ...
- 初涉JSP+JDBC 基于SQL2008的登陆验证程序
简单的以代码的形式纪念一下,因为现在还没有解决SQL2008驱动的问题,并且有好多东西要学,所以日后会有更新~ 所安装的软件有:SQL2008,eclipse,tomcat,JDK,涉及环境配置.等等 ...
- Java 线程结束 & 守护线程
/* 停止线程: 1,stop方法. 2,run方法结束. 怎么控制线程的任务结束呢? 任务中都会有循环结构,只要控制住循环就可以结束任务. 控制循环通常就用定义标记来完成. 但是如果线程处于了冻结状 ...
- express框架结合ejs模板引擎使用
我们在项目里建立一个views文件夹(必须),如果你不想使用views文件夹的话需要调用app.set("views","自定义文件夹名"),然后在里面建立一个 ...
- 解决在Mac上用pyenv安装python3失败的问题
背景 前段时间在本地Mac系统上要跑一个python3写的压测脚本. Mac默认安装的是python2, 而且很多软件依赖的也是python2. 为了不影响现有系统其它软件, 当时安装了pyenv来实 ...
- IE盒模型与W3C盒模型区别
前两天被人问到,叫我解释一下标准盒模型与IE盒模型,额,当时只能说,知道一点,但是没有深入的去探讨过,所以下来之后就自己写了例子,亲自去验证并且查看了网上的一些资料,现将其整理如下: 一.css盒模型 ...
- centos升级内核(rpm方式)
#rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 如果失败的话多试几次,感觉网络不是很好#rpm -ivh http://www. ...
- Java多线程(三) —— 线程并发库之总体架构
对java并发库一直觉得很神秘,决定好好研究一下. 参考文献: https://blog.csdn.net/hp910315/article/details/50963095 http://www.b ...