JSON总结
程序员文章站
2022-03-01 15:44:38
...
文章目录
一、简介
- JSON:JavaScript 对象表示法(JavaScript Object Notation)。
- JSON 是存储和交换文本信息的语法。类似 XML。
- JSON 比 XML 更小、更快,更易解析。
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言
- JSON 具有自我描述性,更易理解
- JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
二、与XML进行比较
1、类似XML
- JSON 是纯文本
- JSON 具有“自我描述性”(人类可读)
- JSON 具有层级结构(值中存在值)
- JSON 可通过 JavaScript 进行解析
- JSON 数据可使用 AJAX 进行传输
2、与XML的不同之处
- 没有结束标签
- 更短
- 读写的速度更快
- 能够使用内建的 JavaScript eval() 方法进行解析
- 使用数组
- 不使用保留
三、为什么使用JSON
对于 AJAX 应用程序来说,JSON 比 XML 更快更易使用:
1、使用XML
- 读取 XML 文档
- 使用 XML DOM 来循环遍历文档
- 读取值并存储在变量中
2、使用JSON
- 读取 JSON 字符串
- 用 eval() 处理 JSON 字符串
四、语法
JSON 语法是 JavaScript 语法的子集。
1、json 的语法规则
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
2、json 名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"firstName" : "John"
这很容易理解,等价于这条 JavaScript 语句:
firstName = "John"
3、json值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
4、json对象
JSON 对象在花括号中书写:
对象可以包含多个名称/值对:
{ "firstName":"John" , "lastName":"Doe" }
这一点也容易理解,与这条 JavaScript 语句等价:
firstName = "John"
lastName = "Doe"
5、json数组
JSON 数组在方括号中书写:
数组可包含多个对象:
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
在上面的例子中,对象 “employees” 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
6、json文件
- JSON 文件的文件类型是 “.json”
- JSON 文本的 MIME 类型是 “application/json”
五、转换★★★★★(重点)
1、Js中的json转换问题
1.1 将jsonStr -> jsonObj
- JSON.parse(jsonStr);
示例:
//json 字符串
var jsonStr = '{"name1":"value1","name2":"value2","name3":[1,"str",true]}';
//json 对象
var jsonObj = {"name1":"value1","name2":"value2","name3":[1,"str",true]};
//将jsonStr -> jsonObj JSON.parse(jsonStr)
var jObj = JSON.parse(jsonStr);
1.2 将jsonObj -> jsonStr
- JSON.stringify(jsonObj);
//将jsonObj -> jsonStr JSON.stringify(jsonObj)
var jStr = JSON.stringify(jsonObj);
2、Java中json转换问题
2.1 将jsonStr -> javaObj
- fromJson(String str,Class clazz)
- fromJson(String str,Type type)
- gson.fromJson(jsonStr, new TypeToken<List>(){}.getType());
示例:
List转json串
void testList() {
List<Student> list = new ArrayList<>();
list.add(new Student("zs", 18, "男"));
list.add(new Student("ls", 19, "女"));
list.add(new Student("ww", 20, "不详"));
//将list转换为jsonStr
String jsonStr = gson.toJson(list);
//[{"name":"zs","age":18,"gender":"男"}, {"name":"zs","age":18,"gender":"男"}, {"name":"zs","age":18,"gender":"男"}]
System.out.println(jsonStr);
//jsonStr->list,关键位置,这里使用的是TypeToken的子类
List<Student> list2 = gson.fromJson(jsonStr, new TypeToken<List<Student>>(){}.getType());
System.out.println(list2.get(0).getName());
}
Map转json串
void testMap() {
Map<String,Student> map = new HashMap<>();
map.put("zs", new Student("zs", 18, "男") );
map.put("ls", new Student("ls", 19, "女") );
map.put("ww", new Student("ww", 20, "不详") );
//map->jsonStr
String jsonStr = gson.toJson(map); //{"zs":{{"name":"zs","age":18,"gender":"男"},"ls":{"name":"zs","age":18,"gender":"男"},}
//jsonStr->map,关键位置,这里使用的是TypeToken的子类
Map<String,Student> map2 = gson.fromJson(jsonStr, new TypeToken<Map<String,Student>>(){}.getType());
System.out.println(map2.get("zs").getName());
}
2.2 将javaObj -> jsonStr
- toJson()
void testStudent() {
//student -> jsonStr
Student stu = new Student("zs", 18, "男");
//new Gson
String jsonStr = gson.toJson(stu); //String str = {"name":"zs","age":18,"gender":"男"}
System.out.println(jsonStr);
//jsonStr -> Student
Student student = gson.fromJson(jsonStr, Student.class);
System.out.println(student.getName());
}