周末整理学习成果,深入探究JSON数据结构与值格式

[id_2054247314]
很多人心里都会有回答,有一种数据交换格式,这是没毛病的。JSON 就是一种轻量级的数据交换格式,并且它与开发语言无关。
JSON的数据结构呢?
一个对象具有一系列非排序的键/值对,它以 {开始,以 }结束。每个键/值对由 : 进行分区,多个键值对通过, 进行分割。要注意的是,JSON 的键是一个 String 类型的字符串。
[id_962242752]
值可以是用双引号括起来的字符串;值可以是数值;值可以是 true;值可以是 false;值可以是 null;值可以是对象;值可以是数组。并且这些结构能够相互嵌套使用。
JSON在java中的使用
简要阐述了 JSON 的概述,接着呈现这篇文章的重点:在 Java 中对 JSON 的使用。
在 Java 中,它本身并未内置 JSON 的解析功能。所以,要使用 JSON 的话,就必须借助第三方类库。经过归纳总结,总共存在 4 种方式。接下来,将围绕每种方式的生成和解析这两个方面进行详细的阐述。
1.JSON官方
2.GSON:谷歌开发的 JSON 库,功能十分全面。
FastJSON 是由阿里巴巴开发的 JSON 库,它的性能非常优秀。
4.Jaskon:社区十分活跃且更新速度很快。
[id_1247749100]
官方提供的 JSON 具有通用性。不过在解析的时候会有点费事。反正我不会使用它,哈哈。
maven依赖:
org.json
json
20180130
生成JSON对象
1.使用JSONObject添加对象
代码:
@Test
public void Test3(){
//创建JSON对象
JSONObject jsonObject = new JSONObject();
Object obj = null;
//像JSON对象中添加数据
jsonObject.put("name", "张三");
jsonObject.put("age", 20);
jsonObject.put("birth", "1998-01-01");
jsonObject.put("haveCar", obj);
jsonObject.put("hasGirlfriend", true);
jsonObject.put("likes", new String[]{"看电影", "看书"});
//将JSON对象以字符串的形式打印
System.out.println(jsonObject.toString());
}
结果:
在进行字符串输出时会察觉到,输出的字符串和数据存储的顺序或许是不相同的。这是因为在调用 jsonObject.put()方法时,其内部是一个 HashMap,数据被存入了 HashMap 中。由于 HashMap 是依据键的哈希码来确定键的位置的,所以就可能会出现上述的问题。
因为 jsonObject.put()方法的底层是对 HashMap 的操作,所以想知道能否把一个 HashMap 转换成 JSON 数据呢?答案是可以的。其原因是 JSONObject 类提供了一个构造函数,而这个构造函数所接收的正是一个 Map。
2.javaBean转JSON
javaBean:
public class User {
private String name;
private int age;
private String[] likes;
// 省略 get 与 set 方法
}
JavaBean TO JSON:
public static void beanToJsonTest() {
User user = new User();
user.setName("张三");
user.setAge(20);
user.setLikes(new String[]{"看电影", "看书"});
JSONObject jsonObject = new JSONObject(user);
System.out.println(jsonObject.toString());
}
解析JSON
有两张表,一张是学生表,另一张是年级表。年纪与学生呈一对多的关系。在此我不展示表了,因为它们太简单了。直接给出解析代码:(务必查看注释哦!)
//JSON字符串
String json = 一个字典,其中键为'id',值为 1,键为'name',值为'JAVAEE-1703',还有一个键为'stus',值为一个列表。这个列表中包含两个字典,第一个字典的键为'id',值为 101,键为'name',值为'刘一',键为'age',值为 16;第二个字典的键为'id',值为 102,键为'name',值为'刘二',键为'age',值为 23。;
//将JSON字符串转为JSON对象
JSONObject jsonObject = JSONObject.fromObject(json);
//创建年级对象,然后进行解析JSON,并赋值
Grade grade = new Grade();
grade.setId(jsonObject.getInt("id"));
grade.setName(jsonObject.getString("name"));
//创建一个集合用来存储学生对象
ArrayList<Student> students = new ArrayList<>();
JSONArray stus = jsonObject.getJSONArray("stus");
//遍历JSONArray对象,解析后放入集合中
for (Object o : stus) {
JSONObject jsonObject1 = JSONObject.fromObject(o);
Student student = new Student(jsonObject1.getInt("id"),jsonObject1.getString("name"), jsonObject1.getInt("age"));
students.add(student);
}
grade.setStus(students) ;
//至此一个JSON字符串解析为Java对象
2.使用GSON
依赖
com.google.code.gson
gson
2.8.2
生成JSON对象:
public static void beanToJsonTest() {
User user = new User();
user.setName("张三");
user.setAge(20);
user.setLike(new String[]{"看电影", "看书"});
/**
使用 GsonBuilder 能够进行一些额外的处理,例如实现格式化输出以及进行预处理等。
*
创建一个 GsonBuilder 实例,名为 gsonBuilder,即 new GsonBuilder() 并赋值给 gsonBuilder 。
gsonBuilder 设定了美化打印的功能。
Gson 被创建,创建者是 gsonBuilder,创建后的结果赋值给 gson 。
*/
Gson gson = new Gson();
System.out.println(gson.toJson(user));
}
解析JSON
public static void jsonToBeanTest() {
String jsonStr = 此人名为李四,年龄 22 岁,爱好有看电影和看书,出生于 1996 年 1 月 1 日。;
GsonBuilder gsonBuilder = new GsonBuilder();
// 设置日期转换格式
gsonBuilder.setDateFormat("yyyy-MM--dd");
Gson gson = gsonBuilder.create();
待解析的字符串为第一个参数,第二个参数是结果数据类型的 Class 对象。
User user = gson.fromJson(jsonStr, User.class);
}
不用get取值,set赋值了,看起来好爽啊。有没有?
String json2 = 杭州;
//解析数组要求使用Type
ArrayList<String> list=gson.fromJson(json2, new TypeToken<ArrayList<String>>(){}.getType());
System.out.println(list);
3.使用FastJSON
FastJSON 是阿里巴巴的产品,它的效率极高,深受广大程序员的喜爱。不过在此我仅写下上述的常见内容,即生成和解析方面。若想更多地了解它,可以去查看这个 FastJSON,它非常棒。
依赖
com.alibaba
fastjson
1.2.47
生成JSON对象:
创建 JSON 对象很简单,只需运用 JSONObject(fastJson 所提供的用于表示 JSON 的对象)以及 JSONArray(fastJson 提供的用于表示 JSON 数组的对象)。
@Test
public void 在生成 JSON 时与生成正确内容进行比较。() throws ParseException {
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < 2; i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("AGE", 10);
jsonObject.put("FULL NAME", "Doe " + i);
jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
jsonArray.add(jsonObject);
}
String jsonOutput = jsonArray.toJSONString();
}
解析JSON
@Test
public void 当进行 Json 操作时,如果 Json 与要转换为的对象不匹配,就需要进行正确的转换。() {
Person person = new Person(20, "John", "Doe", new Date());
String jsonObject = JSON.toJSONString(person);
Person newPerson = JSON.parseObject(jsonObject, Person.class);
JSON 对象与字符串的相互转化
最常用的就是这个直接转化了,来吧:
//从字符串解析JSON对象
JSONObject obj = JSON.parseObject("{\"runoob\":\"菜鸟教程\"}");
//从字符串解析JSON数组
JSONArray arr = JSON.parseArray("[\"菜鸟教程\",\"RUNOOB\"]\n");
//将JSON对象转化为字符串
String objStr = JSON.toJSONString(obj);
//将JSON数组转化为字符串
String arrStr = JSON.toJSONString(arr);
4.使用JackSon
jackSon 对 JSON 进行解析,而 SpringMVC 内置的解析器就是这个。
依赖
com.fasterxml.jackson.core
jackson-databind
2.9.8
生成JSON字符串
ArrayList<Student> students = new ArrayList<>();
for (int i = 0; i < 3; i++) {
students.add(new Student(100 + i, "二稿" + i, 1000 + i));
}
Grade grade = new Grade(22, "语文", students);
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(grade);
System.out.println(s);
解析JSON字符串
// 对象嵌套数组嵌套对象
String json1 = 这个 JSON 数据包含一个 id 为 1 且 name 为"JAVAEE-1703"的对象,以及该对象下的一个 stu 数组,数组中包含一个 id 为 101 且 name 为"刘一"、age 为 16 的元素。;
// 数组
String json2 = "[\"北京\",\"天津\",\"杭州\"]";
ObjectMapper mapper = new ObjectMapper();
Grade grade = mapper.readValue(json1, Grade.class);
System.out.println(grade);
List<String> list = mapper.readValue(json2, newTypeReference<List<String>>() {});
System.out.println(list);
如果你不知道JSON对象是啥玩意:
看这篇文章啦:JsonElement简单说明
一口气整理完后,感觉非常累呢。倘若你觉得本文对你有所帮助,那就给萧然点个赞来鼓励一下吧,嘿嘿。接下来,要感谢以下文章的博主,并附上链接:
1.
2.
3.还有菜鸟教程: