JSON:JSON是一种与开发语言无关的轻量级的数据格式全称是:JavaScript Object Notation。可以说他是一种数据格式的标准,或者规范。
JSON的优点:易于人的阅读和编写,易于程序解析与生成
标准的JSON数据表示:数据结构:Object,Array;基本类型:string,number(无浮点数之分),true,false,null。
- 数据结构:Object:使用花括号{}包含的键值对结构,Key必须是string类型(使用双引号“key”来进行包装),value为任何基本类型或数据结构,中间用冒号对应。
- 数据结构:Array:使用中括号[]来起始,并用逗号来分割元素,元素可以是任何类型(基本类型和数据结构)
下面我们来看一个JSON格式的简单样例:
private static void jsonObject() {
// TODO Auto-generated method stub
JSONObject jsonObject = new JSONObject();
Object objectnull = null;
jsonObject.put("name", "小姚同学");
jsonObject.put("age", "22");
jsonObject.put("birthday", "1997-01-10");
jsonObject.put("school", "蓝翔");
jsonObject.put("major", new String[] {"理发","挖掘机"});
jsonObject.put("has_boyfriend", true);
jsonObject.put("car", objectnull);
jsonObject.put("comment", "这是一个注释");
System.out.println(jsonObject.toString());
}
下面,我们来通过hashmap的方式来构建json数据结构
private static void createJsonByMap() {
//创建一个hashmap
HashMap<String, Object> xiaoyao = new HashMap<String, Object>();
Object objectnull = null;
xiaoyao.put("name", "小姚同学");
xiaoyao.put("age", "22");
xiaoyao.put("birthday", "1997-01-10");
xiaoyao.put("school", "蓝翔");
xiaoyao.put("major", new String[] {"理发","挖掘机"});
xiaoyao.put("has_boyfriend", true);
xiaoyao.put("car", objectnull);
xiaoyao.put("comment", "这是一个注释");
JSONObject jsonObject = new JSONObject(xiaoyao);
System.out.println(jsonObject.toString());
}
方法类似,区别在于先创建HashMap,然后用JSONObject的构造函数传入HashMap,多了这一步骤。
下面,我们来看一下用JavaBean来构建一个对象
private static void createJsonByBean() {
Human huam= new Human();
huam.setName("小姚同学");
huam.setAge(22);
huam.setBirthday("1997-1-10");
huam.setSchool("蓝翔");;
huam.setMajor(new String[] {"理发","挖掘机"});
huam.setCar(null);
huam.setHas_boyfriend(true);
huam.setComment("这是一个注释");
JSONObject J = new JSONObject(huam);
System.out.println(J.toString());
}
下面看一下如何解析一个JSON数据
首先要创建一个JSON数据对象
然后要获取这个文件
最后解析这个文件来打印输出
{
"name" : "小姚同学",
"age" : 20,
"birthday" : "1997-1-10",
"school" : "蓝翔",
"car" : null,
"comment" : "这是一个注释",
"major" : ["理发","挖掘机"]
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
File file = new File(ReadJson.class.getResource("xiaoyaotongxue.json").getFile());
String content = FileUtils.readFileToString(file);
JSONObject jsonObject = new JSONObject(content);
System.out.println("姓名是:" + jsonObject.getString("name"));
System.out.println("年龄是:" + jsonObject.getInt("age"));
System.out.println("生日是:" + jsonObject.getString("birthday"));
System.out.println("学校是:" + jsonObject.getString("school"));
System.out.println("课程有:" + jsonObject.getJSONArray("major"));
}
}
看一下输出结果:
很棒,木的问题!
接下来我们来学习一个更为方便,高效的数据格式——GSON
GSON是Google给出的一个开源项目,可以说他是对json的一个改进
一样的,首先我们要引入gson 的依赖包,一样在pom文件中
然后来看一下代码
public static void main(String[] args) {
// TODO Auto-generated method stub
Human huam= new Human();
huam.setName("小姚同学");
huam.setAge(22);
huam.setBirthday("1997-1-10");
huam.setSchool("蓝翔");;
huam.setMajor(new String[] {"理发","挖掘机"});
huam.setCar(null);
huam.setHas_boyfriend(true);
huam.setComment("这是一个注释");
Gson gson = new Gson();
System.out.println(gson.toJson(huam));
}
复用一下前面的代码,用JavaBean来创建一个Human对象
然后创建一个Gson对象,调用.toJson方法,传入Human对象就好了
可能有些同学会说,这个json不一样吗,没看出来好在哪里
下面我用一个例子来说一个好处:
public static void main(String[] args) {
// TODO Auto-generated method stub
Human huam= new Human();
huam.setName("小姚同学");
huam.setAge(22);
huam.setBirthday("1997-1-10");
huam.setSchool("蓝翔");;
huam.setMajor(new String[] {"理发","挖掘机"});
huam.setCar(null);
huam.setHas_boyfriend(true);
huam.setComment("这是一个注释");
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();
System.out.println(gson.toJson(huam));
}
可以看到,这段代码与之前相比,创建了一个GsonBuilder对象,然后调用了一个.setPrettyPrinting()方法,而且Gson对象不是new出来的了,而是用GsonBuilder来create出来的,我们来看一下输出
有没有发现,和上面那个输出有明显的区别把,易读性大大提高啊!!有没有!!!
我们还可以用GsonBuilder 做更多的事情,比如`gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
public String translateName(Field arg0) {
// TODO Auto-generated method stub
if (arg0.getName().equals("name")) {
return "NAME";
}
return arg0.getName();
}
});`
调用这个函数,来做一些额外的策略,比如这个就是将小写的name,转换为大写的NAME.
这里还要介绍一个关键字:transient。
这个关键字修饰的属性,在Gson数据的生成过程中,会忽略掉这个属性
具体实现同学们自己试试吧
关于Gson 的解析,调用gson.fromJson()方法
第一个参数读取文件所获取的内容,也就是要解析的数据,第二个参数是你要解析成什么样的格式
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();
Human human = gson.fromJson(content, Human.class);
System.out.println(human);
其实,gson里的数组和Java中的集合类可以进行无缝的对接,因为通常实际开发中,常用集合类来代替数组,因为集合类比数组拥有更多的特性从而满足不同的应用
下面就来介绍一个例子
我们把前面Human类中major数组改为最常见的List集合类,相应的get,set,toString方法也要变
然后打印major
可以看出,在使用Gson中,所有的集合类和Java中的数组其实是可以一一对应的。