什么是JSON:
JSON(JavaScript Object Notation)是一种与开发语言无关的,轻量级的数据格式。这里提下XML,XML语言冗余,解析数据太慢。所以,在前端开发中,JavaScript语言最早使用了JSON这种数据格式,现在,几乎你知道的每门开发语言都支持JSO的API。
JSON的特点:
1.与开发语言无关
2.容易阅读和编写,程序容易解析和生成:
JSON是非常简单,而且非常容易看懂,也很容易就可以编写。对于程序来讲,解析数据的速度和传输,是很重要的条件,JSON格式小,容易解析,容易在互联网传输,特别考虑了网络带宽的占用资源,这个和XML比较起来,是有绝对的优势。现在很少公司用xml来存储数据,xml是已经过时的一种技术。所以,JSON就这样流行起来了。
简单JSON的例子:
JSON有点像很多语言中的字典,由key 和value得方式组成,还支持嵌套。下面来看一个简单的JSON例子。
{ "title" : "初识JSON", "author" : "gyx", "author" : ["JSON基础","初识JSON"], “time” : { “value” : 2018, “unit” : “年” } }
从上面可以看出:
1)都是字典组成,左边是key,右边是value。
2)支持嵌套,记得多对到括号是成对出现,容易丢失一半。
3)除了最后一个元素,其他元素后面都加上逗号,这个容易丢失,写错。
4)value部分如果是字符串,一定要用引号引用起来,如果是数字,直接写数字就可以,当然,数字引用起来也可以,就当做是字符串存储。
JSON的数据类型:
学习过Java或者其他编程语言的人,都是从数据基本类型学起,有int,float,char,byte等.
{ "title" : "初识JSON", "author" : "gyx", "author" : ["JSON基础","初识JSON"], “time” : { “value” : 2018, “unit” : “年” } }
1.JSON中的数据类型组成
JSON中数据类型也分基本数据类型和数据结构类型。
1)数据结构类型
上面的大括号({})和中括号([]), 大括号表示是结构体类型(object),中括号表示是数组类型(array)。
2)基本数据类型
有5中基本数据类型:string, number, true, false,null
其中,字符串类型就是用双引号包裹的,数字类型,直接写数字就可以,如果数字用双引号,就变成了字符串。true和false是布尔型,还有一种为空,用关键字null表示。
2.利用数据类型来描述一个人:
需求:利用上面介绍的JSON数据类型,来写一个能够描述一个屌丝。该屌丝的文字描述如下:
-.屌丝名字叫张三
-.年龄是24岁半
-.生日是19xx年xx月xx日
-.毕业学校是蓝翔技校
-.专业是:理发和开挖掘机
-.没有车
-.没有房子
-.没车没房,当然也没有女朋友
根据上面的条件,我们来拿着条件和JSON的数据类型对照,看看哪些条件的值适合用数字,哪些适合字符串,哪些是null,哪些是数字,哪些是布尔型。例如下面这样设计
1)名字,张三肯定是字符串
2)年龄,24岁半,可以写成24.5,所以这个是一个数字
3)生日,由于JSON是没有日期格式,所以,这个还是一个字符串
4)毕业学校,蓝翔技校,是一个字符串
5)专业,这个地方有两个值,所以,这个需要用数组
6)没有车,没有房,,没有女朋友,可以用null或者布尔型
所以,我们在notepadd++中可以这样写这个JSON数据。
{ “name” : “张三”, “age” : 24.5, “birthday" : "19xx-xx-xx", “school” : “蓝翔技校”, “major” : ["理发师", "挖掘机"], “car” : null, “has_hourse” : false, “has_girlfriend : false }
用json.org来构建JSON数据并输出:
前面我们直接创建一个JSON数据,但是并不知道整个如何用Java代码来构造这个JSON数据的过程。这篇我们开始介绍JSON的使用,主要介绍一个json.org库,通过这个库提供的方法,在Eclipse中写一个简单的java程序来测试下JSON的构造和输出。
1. 创建一个Eclipse项目
这部分很简单,直接新建一个Java项目。
2.下载json.org.jar
浏览器打开网站http://mvnrepository.com/artifact/org.json/json/20180130,点击下图中的位置,下载后是一个jar文件。
3. 把下载的文件json-20170516.jar添加到项目Build path
建议,在这个java项目下,新建一个文件夹jars,然后把json-20170516.jar放到jars下,然后再添加到当前项目的build path。
4. 新建一个Java测试类
输入如下代码,可以实现JSON数据的构造过程和打印出JSON数据。
import org.json.JSONObject; public class Demo1 { public static void main(String[] args) { // TODO Auto-generated method stub example(); } public static void example(){ JSONObject zhangsan = new JSONObject(); zhangsan.put("name", "张三"); zhangsan.put("age", 25.2); zhangsan.put("birthday", "1991-06-08"); zhangsan.put("school", "蓝翔技校"); zhangsan.put("major", new String []{"理发师", "挖掘机"}); zhangsan.put("car", false); zhangsan.put("has_girlfriend", false); zhangsan.put("hourse", null); // 利用toSting()方法,然后输出 System.out.println(zhangsan.toString()); } }
面介绍了两种方法,put方法是给JSON对象添加key和value的,注意有不同的数据类型,之前JSON有5中对象,但是这里转换到java就有很多种,具体可以通过输入zhangsan.put就可以看到这些方法。
运行结果:
{ "birthday":"1991-06-08", "major":["理发师","挖掘机"], "school":"蓝翔技校", "car":false,"name":"张三", "has_girlfriend":false, "age":25.2 }
这个在eclipse上输出一样,显示不友好,这里有一个方法可以检查输出是否是JSON格式。浏览器打开一个在线JSON 编辑网站:http://www.jsoneditoronline.org/
把eclipse中运行输出的这行数据拷贝到网站,点击 向右 向左的箭头,左边拷贝的字符串就变成了JSON格式。
利用HashMap来构建JSON:
利用HashMap来构建JSON数据。前面一篇文章,我们是先创建一个JSONObject的实例对象,然后给这个实例进行构造。
直接来看代码:
package json; import java.util.HashMap; import java.util.Map; import org.json.JSONObject; public class Demo1 { public static void main(String[] args){ createJsonByMap(); } public static void createJsonByMap(){ Map<String, Object> zhangsan = new HashMap<String, Object>(); zhangsan.put("name", "张三"); zhangsan.put("age", 25.2); zhangsan.put("birthday", "1991-06-08"); zhangsan.put("school", "蓝翔技校"); zhangsan.put("major", new String []{"理发师", "挖掘机"}); zhangsan.put("car", false); zhangsan.put("has_girlfriend", false); zhangsan.put("hourse", null); System.out.println(new JSONObject(zhangsan).toString()); } }
上面代码和简单,拷贝了前面一篇文章中很多的代码,zhangsan先是一个HashMap对象,然后又把这个对象当做一个JSONObject对象来传入,从而,有了toString的方法。输出结果和前面一篇文章一样,同样你也可以拷贝输出结果到JSON 在线编辑网站进行对比。
用JavaBean来构建JSON:
前面我们介绍用JSONObject和HashMap来构造JSON数据,其实实际项目开发中,可能更多利用JavaBean来构造JSON。简单来说,JavaBean是可复用的平台独立的软件组件,也就是说复用性很高。
JavaBean类内容如下:
package bean; /** * @author Administrator * */ public class DiaoSi { private String name; private String school; private boolean has_girlfriend; private double age; private Object car; private Object hourse; private String[] major; private String birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } public boolean isHas_girlfriend() { return has_girlfriend; } public void setHas_girlfriend(boolean has_girlfriend) { this.has_girlfriend = has_girlfriend; } public double getAge() { return age; } public void setAge(double age) { this.age = age; } public Object getCar() { return car; } public void setCar(Object car) { this.car = car; } public Object getHourse() { return hourse; } public void setHourse(Object hourse) { this.hourse = hourse; } public String[] getMajor() { return major; } public void setMajor(String[] major) { this.major = major; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } }
3.测试类的写法:
package json; import org.json.JSONObject; import bean.DiaoSi; public class Demo1 { public static void main(String[] args){ createJsonByMap(); } public static void createJsonByMap(){ DiaoSi zhangsan = new DiaoSi(); zhangsan.setAge(25.2); zhangsan.setBirthday("1991-08-23"); zhangsan.setCar(null); zhangsan.setHas_girlfriend(false); zhangsan.setHourse(null); zhangsan.setMajor(new String[]{"理发师", "挖掘机"}); zhangsan.setName("张三"); zhangsan.setSchool("蓝翔技校"); System.out.println(new JSONObject(zhangsan).toString()); } }
JSON的解析:
1.构造一个test.json文件:
先在当前eclips项目的根目录,创建一个test.json文件,然后把前面几篇文章中输出的json数据黏贴进入,保存。
2.现在commons-io.jar文件,并放到项目build path
浏览器打开地址:http://mvnrepository.com/artifact/commons-io/commons-io/2.5,点击下载链接进行下载.
下载好的文件,添加当项目的build path。
3.新建一个ReadJSON.java文件,写入如下内容。
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.json.JSONArray; import org.json.JSONObject; public class ReadJSON { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //获取文件路径并加载 File file = new File("./test.json"); //通过 commons-io 里方法读取文件内容 String content = FileUtils.readFileToString(file, "utf8"); //转换JSON对象进行处理 JSONObject jsonObject = new JSONObject(content); //根据getString()获取姓名 System.out.println("姓名是:"+jsonObject.getString("name")); //根据getDouble()获取年龄 System.out.println("年龄:"+jsonObject.getDouble("age")); //获取是否有女朋友 System.out.println("是否有女朋友:"+jsonObject.getBoolean("has_girlfriend")); //把json数组对象转换成Java的数组对象 JSONArray jsonarray = jsonObject.getJSONArray("major"); //变量专业 for(int i=0; i<jsonarray.length(); i++){ System.out.println("专业-"+(i+1)+":"+ jsonarray.get(i)); } } }
运行结果:
姓名是:张三 年龄:25.2 是否有女朋友:false 专业-1:理发师 专业-2:挖掘机
JSON的总结:
到这里,我们学习了如何用例JSON-JAVA来构建JSON数据和解析JSON。其实整个过程,看起来,使用也不是很方便是不是。确实,基于json.org的解析和构造看起来很原始,但是确实需要我去了解和学习。在前面解析的基础之上,这里插入一个经常使用的小技巧。
1.解析之前,先进行为空判断
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.json.JSONArray; import org.json.JSONObject; public class ReadJSON { public static void main(String[] args) throws IOException { //获取文件路径并加载 File file = new File("./test.json"); //通过 commons-io 里方法读取文件内容 String content = FileUtils.readFileToString(file, "utf8"); //转换JSON对象进行处理 JSONObject jsonObject = new JSONObject(content); if(jsonObject.isNull("address")){ System.out.println("该JSON文件不存在address这个key字段"); } if(!jsonObject.isNull("name")){ //根据getString()获取姓名 System.out.println("姓名是:"+jsonObject.getString("name")); } //根据getDouble()获取年龄 System.out.println("年龄:"+jsonObject.getDouble("age")); //获取是否有女朋友 System.out.println("是否有女朋友:"+jsonObject.getBoolean("has_girlfriend")); //把json数组对象转换成Java的数组对象 JSONArray jsonarray = jsonObject.getJSONArray("major"); //变量专业 for(int i=0; i<jsonarray.length(); i++){ System.out.println("专业-"+(i+1)+":"+ jsonarray.get(i)); } } }
上面插入了为空和不为空判断。当我们想根据一个key来获取对应的value的时候,最后先进行下不为空的判断,然后才去获取。毕竟JSON数据有时候来源网络,可能存在字段丢失或者不准确的情况,如果本来就不准确,那么获取剩下的信息就没有意义。
总结:
利用json.org构造JSON对象和commons-io进行解析JSON数据就介绍到这里。其实关于JSON解析,开源工具还有其他的,例如Google的GSON,和阿里巴巴的Fast json。这里举例阿里巴巴的Fast json在github上的地址:https://github.com/alibaba/fastjson,这个github有1万多个star,说明还是很出名的。接下来后面的文章,我打算介绍阿里巴巴的fast json的基本使用,你会发现要比json.org要简单很方便,强大很多。
还没有评论,来说两句吧...