`
苗振忠
  • 浏览: 57235 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

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对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)

 

分享到:
评论

相关推荐

    Android 安卓 json解析

    解析步骤与本地JSON解析相同。 ### 4. 错误处理与优化 在实际应用中,我们需要处理可能的异常,如网络错误、JSON格式错误等。同时,为了提高性能,可以考虑使用异步操作,例如`AsyncTask`或`Retrofit`等库。 ### 5...

    C#对多级json解析

    解析JSON的基本步骤如下: 1. **安装Json.NET**: 在Visual Studio中,可以通过NuGet包管理器安装Json.NET。在包管理控制台输入 `Install-Package Newtonsoft.Json` 即可。 2. **JSON字符串到对象的转换**: 使用`...

    易语言页面订单json解析

    3. **JSON解析**:易语言提供了JSON解析的库或模块,允许我们解析JSON字符串为易语言的数据结构,如数组或字典。解析过程中,我们需要识别并提取出订单的关键信息,如订单ID、客户信息、商品详情等。 4. **将订单...

    kettle解析json串

    ### Kettle与JSON解析概述 #### 1. **Kettle简介** - Kettle(Pentaho Data Integration,简称PDI)是一款开源的数据集成工具,广泛用于ETL(Extract-Transform-Load)任务。 - Kettle支持多种数据源,包括关系型...

    JSON解析demo.zip

    在Android开发中,JSON解析是至关重要的,因为很多API接口返回的数据都是JSON格式。 在Android中,我们可以使用多种库来解析JSON数据,如`org.json`库(内置于Android SDK)、Gson库、Jackson库以及FastJson库等。...

    C语言精简JSON解析程序,可用于单片机等资源稀缺硬件

    通过阅读和理解这些源码,开发者可以学习到如何在C语言环境中实现JSON解析的基本步骤和技巧。 6. **错误检测与优化** 由于是精简版本,可能存在一些未发现的bug。开发者社区的参与和反馈对于完善和优化这个程序至...

    C#中Json 解析类库,使用dictionary 解析未知字段的对象

    在C#中,当你面对未知结构的JSON数据,即不能预先定义强类型对象时,可以使用`Dictionary, object&gt;`作为载体,将JSON解析为键值对的形式。 以下是使用Json.NET库解析JSON的基本步骤: 1. 引入库:确保项目引用了...

    PB9生成和解析JSON

    // (此处省略具体实现,因为PB9自身不提供JSON解析功能) // ... // 返回解析后的数据 return parsedDict end function ``` 在实际应用中,你还需要考虑错误处理,比如处理无效的JSON字符串,以及数据类型转换...

    json解析工具

    `使用说明.txt`则提供了关于如何使用该工具的详细步骤和提示,帮助用户更好地掌握工具的使用方法。`当下软件园.url`可能是一个链接,指向下载该工具或其他相关资源的网站。 在实际开发中,JSON解析工具不仅对前端...

    json解析_简单的练习

    在Android开发中,JSON解析是必不可少的技能,它可以帮助应用程序处理服务器返回的数据或存储本地数据。 在"json解析_简单的练习"这个主题中,我们主要关注如何在Android环境下对JSON进行解析。文件列表中包含了`...

    json解析助手

    幸运的是,随着“json解析助手”的出现,这一挑战得以有效应对。 “json解析助手”是一款功能强大的工具,它专注于将复杂的JSON数据以树状结构的形式可视化呈现。这样的可视化方法使得开发者可以直观地浏览JSON数据...

    xmljson解析客户端

    本文将探讨"xmljson解析客户端"相关的知识点,包括XML和JSON的基本概念、它们之间的转换,以及可能使用的解析库。 首先,XML是一种基于文本的标记语言,它的主要特点是可以定义自定义的标签来表示数据。XML文档由...

    三种json解析方法

    下面将详细介绍这三种流行的JSON解析库。 1. **json-lib**: json-lib是Java的一个开源库,它提供了一套完整的JSON处理API,包括JSON的解析、生成、转换等功能。json-lib支持多种Java对象到JSON的转换,例如...

    Json解析VS2012X86Debug

    使用jsoncpp库在VS2012中进行JSON解析的步骤大致如下: 1. **安装与配置**:首先,你需要将jsoncpp库添加到你的项目中。这通常包括将库的头文件目录添加到项目的包含路径,以及链接库文件到你的项目设置。 2. **...

    使用gson解析json

    FastJson是阿里巴巴推出的一个高性能的JSON解析器库,提供了快速和高效的JSON解析和生成功能。FastJson支持许多高级特性,例如JSON路径表达式、JSON模式验证、JSON数据绑定等。 在实际应用中,使用Gson或FastJson...

    json解析源代码

    JSON解析** 解析JSON字符串可以使用`JsonConvert.DeserializeObject`方法。假设我们有一个如下的JSON字符串: ```json { "root": { "children": [ { "name": "节点1", "children": [ {"name": "子节点1.1"},...

    谷歌浏览器插件-json格式解析

    标签“谷歌浏览器插件 JSON解析”再次强调了这是针对谷歌浏览器的一个工具,专注于JSON数据的处理。 在提供的压缩包子文件名列表中,"pkgccpejnmalmdinmhkkfafefagiiiad_2020.05.2810_chrome.zzzmh.cn.crx"看起来像...

    vc6 解析 json

    在IT行业中,Visual C++ 6.0(简称VC6)是一款经典的开发环境,用于编写C++...通过这些步骤和示例,你可以轻松地在你的项目中集成JSON解析功能。虽然VC6相对较旧,但结合合适的库,它仍然可以处理现代的数据交换格式。

    Delphi 7下的JSON解析

    使用SuperObject进行JSON解析的基本步骤如下: 1. 引入SuperObject:在你的Delphi项目中,通过将"superobject.dcu"添加到搜索路径或直接将其包含到项目中,引入SuperObject库。 2. 创建JSON对象:你可以使用`...

    mfc解析json,包含通用文件和详细说明

    集成JSON解析库到MFC项目通常涉及到添加头文件路径、链接库等步骤。资源包中应该包含了这些配置的指导,帮助开发者避免常见的编译错误。 8. **性能和兼容性**: 这个JSON解析库在MFC环境下的性能表现,以及它与...

Global site tag (gtag.js) - Google Analytics