JSON与对象间的转换
1 JSON简介
1.1 什么是JSON
JSON(JavaScript Object Notation),中文译作“JavaScript 对象表示法”,简单来说,以一种特定的格式进行描述一系列的对象,并进行存储和使用。
在JSON解析对象之前还有XML解析对象,但后来通过测试发现,JSON在传输数据上,比XML要快很多,越多的数据,体现出来的差异越明显。
JSON 可以视为一种数据编写的格式。
例:
{
"name" : "张三",
"age" : 24,
"info" : {
"grade" : "研二",
"sex" : "men",
"boby" : ["篮球","足球","游泳","跑步"],
"college" : "清华"
}
}
JSON的格式很清晰,且很简单,接下来简述一下其中标识的一些含义。
- “{}”,括住的内容,是一个对象的内容。
- JSON对象中,是允许嵌套对象的。
- JSON每个属性之间用","隔开
- JSON数据中的"[ ]"所括住的部分,是数组。在Java中,默认解析为集合的形式。
- JSON存储的形式就像是键值对。左边的属性名是键(不能重复),右边属性值是值,中间以":"隔开
针对与这种类型的数据,在以后的开发中,我们经常会遇到JSON类型数据的导入和导出的使用。
在Java中有两种常用的JSON解析工具
- FastJson(阿里推出的JSON解析工具类)
- Gson(Google推出的JSON解析工具类)
这两个jar文件都可以在网上下载到,
2 用Gson操作JSON
常用方法:
- toJson方法,将对象转换成JSON格式的字符串
- fromJson方法,将JSON类型的字符串转换成对象
2.1 将对象转换为JSON字符串
public class Demo01 {
public static void main(String[] args) {
Gson g = new Gson();
//Book定义了id、name、info三个属性,都是String类型
Book b = new Book("1001","鬼谷子","谋略奇书");
//将b对象转换成JSON文件格式对象
String s = g.toJson(b);
System.out.println(s);
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王二麻子");
System.out.println(g.toJson(list));
String[] strings = new String[10];
for (int i = 0; i < 10; i++) {
strings[i] = "第"+(i+1)+"只羊";
}
System.out.println(g.toJson(strings));
}
}
运行结果:
{"id":"1001","name":"鬼谷子","info":"谋略奇书"}
["张三","李四","王二麻子"]
["第1只羊","第2只羊","第3只羊","第4只羊","第5只羊","第6只羊","第7只羊","第8只羊","第9只羊","第10只羊"]
Book类
public class Book {
private String id;
private String name;
private String info;
//省略get/set方法,toString,构造器
}
注意:JSON转换的对象,必须要有get/set方法。否则转换会出错。
如果有布尔类型的量的set方法名,一定是要是isXxx的格式。
2.2 将JSON类型的字符串转换为对象
public class Demo02 {
public static void main(String[] args) {
//转换: {"id":"1001","name":"鬼谷子","info":"谋略奇书"}
String text = "{\"id\":\"1001\",\"name\":\"鬼谷子\",\"info\":\"谋略奇书\"}";
Gson g = new Gson();
Book book = g.fromJson(text, Book.class);
System.out.println(book);
Integer[] strs = g.fromJson("[3,10,12]",Integer[].class);
String str = Arrays.toString(strs);
System.out.println(str);
ArrayList<String> strings = g.fromJson("[第1只羊, 第2只羊, 第3只羊, 第4只羊, 第5只羊, 第6只羊, 第7只羊, 第8只羊, 第9只羊, 第10只羊]",ArrayList.class);
System.out.println(strings);
}
}
3 用FastJson操作JSON
FastJson工具类和Gson使用不同之处在于,其方法是静态的。你可以直接类名 . 方法。这里我再演示一下如何操作一个文件内的JSON对象。
3.1 对象转化成JSON
public class Demo03 {
public static void main(String[] args) {
Book book = new Book("1002","唐诗三百首","床前明月光,疑是地上霜,举头望明月,低头思故乡。");
String string = JSON.toJSONString(book);
System.out.println(string);
}
}
运行结果:
{"id":"1002","info":"床前明月光,疑是地上霜,举头望明月,低头思故乡","name":"唐诗三百首"}
3.2 JSON转换为对象
这里给定一个json文件(hhha.json)
[
{
"name" : "张三",
"age" : 30,
"hoby" : ["游泳","跳远","爬山"],
"detail" : {
"high" : 183,
"weight" : "74kg",
"sex" : "男",
"parents" : ["爸爸","妈妈","儿子","老婆"]
}
},
{
"name" : "李四",
"age" : 29,
"hoby" : ["游泳","篮球","爬山"],
"detail" : {
"high" : 173,
"weight" : "66kg",
"sex" : "男",
"parents" : ["爸爸","妈妈","女儿","老婆"]
}
}
]
使用输入流,读取文件字节流,然后进行转换
public class Demo05 {
public static void main(String[] args) throws IOException {
//转换: {"id":"1002","info":"床前明月光,疑是地上霜,举头望明月,低头思故乡","name":"唐诗三百首"}
Book book = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,疑是地上霜,举头望明月,低头思故乡\",\"name\":\"唐诗三百首\"}",Book.class);
System.out.println(book);
InputStreamReader isr = new InputStreamReader(new FileInputStream("hhha.json"));
StringBuilder sb = new StringBuilder();
char[] chs = new char[1024];
int len = -1;
while ((len=isr.read(chs))!=-1){
sb.append(chs,0,len);
}
isr.close();
String text = sb.toString();
List<Person> p = JSON.parseObject(text, List.class);
System.out.println(p);
}
}
如果以后碰到一个恨到的JSON文件,进行读取的时候,使用大数组进行读取,会加快文件的读写速度,提高效率。
注意:因为读取的文件中可能存在特殊文字的情况,请不要直接使用InputStream进行读取操作,这可能会导致有读取到“半个”文字的情况。使用BufferedReader或者InputStreamReader都可以。
4 总结
JSON文件,一个文件,只会存储一个类型的对象,有多个对象时,会采用数组的方式进行存储同类型的所有变量。一个JSON文件绝对不允许出现两种不同类型的变量,因为这样读取数据的时候,很可能因为类型不同,读取出现数据读取异常等情况。