JSON 及 java对象转换
什么JSON?
JSON(JavaScript Object Notation)js对象表示法。
一种轻量级的文本数据交换格式。
易与人阅读和编写,同时也易于机器的解析和生成。
JSON语法规则
JSON语法是JavaScript对象表示语法的子集。
- 数据在键(名称)/值对中
JSON数据的书写格式
Key : value
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"book" : "西游记"
等价于下面这条JavaScript语句:
book : "西游记"
-
数据由逗号分隔
-
大括号
{}
保存对象 -
中括号
[]
保存数据,数组可以包含多个对象
JSON常用类型
-
数字(整数或浮点数)
-
字符串(在双引号中)
-
逻辑值(true 或 false)
-
数组(在中括号中)
-
对象(在大括号中)
-
null
JSON文件
-
JSON 文件类型是
.json
-
JSON 文件的MIME类型是
application/json
JSON例子
JSON 数字
JSON数字可以是整型或者浮点型
{ "age" : 20 }
JSON 对象
JSON对象在大括号{}
中书写,对象可以包含多个名称/值对。
格式:
{ key1 : value1 , key2 : value2 ... keyN : valueN }
例:
{ "name" : "lisi" , "age" : 18 , "sex" : "男" }
JSON 数组
JSON数组在中括号[]
中书写,数组可以包含多个对象。
格式:
[
{ key1 : value11 , key2 : value21 },
{ key2 : value21 , key2 : value22 },
...
{ keyN : valueN1 , keyN : valueN2 },
]
例:
{
"books" = [
{ "book" : "西游记" , "price" : 25 },
{ "book" : "水浒传" , "price" : 30 },
{ "book" : "红楼梦" , "price" : 28 },
]
}
JSON 布尔值
JSON 布尔值可以是 true 或者 false:
{ "flag" : true }
JSON null
JSON 可以设置null值:
{ "hobby" : null }
JSON 访问对象
JSON 可以通过 ( . ) 来访问对象的值:
var myObject,myName;
myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" };
myName = myObject.name; //myName = "lisi"
JSON 也可以通过 ( [] ) 来访问对象的值:
var myObject,myName;
myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" };
myName = myObject["name"]; //myName = "lisi"
JSON 循环对象
JSON 可以通过 for-in 来循环对象的属性:
var myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" };
for( x in myObject){
Console.log(x); // name age sex
}
JSON 在 for-in 来循环对象的属性时,可以通过 ( [] ) 来访问属性的值:
var myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" };
for( x in myObject){
//下面的 myObject 是指for循环外的 myObject
Console.log(myObject[x]); // lisi 18 男
}
JSON 嵌套对象
JSON 对象中可以包含另外一个对象:
var myObject = {
"name" : "超级书店",
"id" : 111222,
"books" : {
"book1" : "西游记",
"book2" : "水浒传",
"book3" : "红楼梦"
}
}
JSON 修改值
JSON 可以通过点号 ( . ) 来修改值:
var myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" };
myObject.name = "王五";
JSON 可以通过点号 ( [] ) 来修改值:
var myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" };
myObject[name] = "王五";
JSON 删除属性
JSON 可以通过使用 delete 关键字来删除 JSON 对象的属性:
//根据嵌套对象中的数据
delete myObject.books.book1;
也可以通过使用中括号([])
来删除 JSON 对象的属性
//根据嵌套对象中的数据
delete myObject[books][book1];
JSON和XML的比较
相同之处:
1、纯文本
2、具有“自我描述性”(人类可读)
3、具有层级结构(值中存在值)
4、可以通过JavaScript进行解析
5、数据可使用AJAX进行传输
不同之处:
1、没有结束标签
2、更短
3、读写书读更快
4、能够使用内建的JavaScript eval()方法进行解析
5、使用数组
6、不使用保留字
最大的不同是:XML 需要使用 XML 解析器来解析,JSON 可以通过标准的 JavaScript 函数来解析。
在网页中可以通过:
JSON.parse():将一个JSON字符串转换为 JavaScript 对象。
JSON.stringify():将 JavaScript 值转换为JSON字符串。
JSON.parse()
JSON 通常用于与服务器交换数据。
在接收服务器数据时一般是字符串。
通常使用 JSON.parse() 方法将字符串数据装换为 JavaScript 对象。
语法:
JSON.parse(text[, reviver])
参数说明:
text 必需,一个有效的 JSON 字符串。
reviver 可选,一个装换结果的函数,将为对象的每个成员调用此函数。
JSON 解析例子
假如从服务器上接收到以下数据:
{ "name" : "lisi" , "age" : 18 , "sex" : "男" }
可以使用 JSON.parse() 方法处理上面数据,将其转换为 JavaScript 对象:
var myObject = JSON.parse('{ "name" : "lisi" , "age" : 18 , "sex" : "男" }');
提示:JSON不能储存Date对象。
如果你需要存储Date对象,需要将其转换为字符串。
之后再将字符串转换为Date对象。
var text = '{ "name" : "lisi" , "birth" : "2000-8-8" , "sex" : "男" }';
var myObject = JSON.parse(text, function (key,value){
if(key == "birth"){
return new Date(value);
}
else{
return value;
}
});
提示:JSON不允许包含函数。
但你可以将函数作为字符串存储,之后再将字符串转换为函数。
var text = '{ "name" : "lisi" , "age" : 18 , "sex" : "男" , "myFunction" : "function (){
return 99;}"
}';
var myObject = JSON.parse(text);
myObject.myFunction = eval("(" + myObject.myFunction + ")");
JSON.stringify()
JSON 通常用于与服务端交换数据。
在向服务器发送数据时一般是字符串。
我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。
语法:
JSON.stringify(value[, replacer[, space]])
参数说明:
value 必需, 要转换的 JavaScript 值(通常为对象或数组)。
replacer 可选,用于转换结果的函数或数组。
space 可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格。
JavaScript 对象转换
假如向服务器发送以下数据:
var myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" }
可以使用 JSON.stringify() 方法处理上面数据,将其转换为字符串:
var myJSON = JSON.stringify(myObject);
JavaScript 数组转换
var myObject = [ "西游记" , "红楼梦" , "水浒传"];
var myJSON = JSON.stringify(myObject);
JSON不能存储Date对象。
JSON.stringify() 会将所有日期装换为字符串。
var myObject = { "name" : "lisi" , "birth" : new Date() , "sex" : "男" };
var myJSON = JSON.stringify(myObject);
JSON 不允许包含函数,JSON.stringify() 会删除 JavaScript 对象的函数,包括 key 和 value。
var myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" , "myFunction" : "function (){
return 99;}"
};
var myJSON = JSON.stringify(myObject);
输出 myJSON 为:{ “name” : “lisi” , “age” : 18 , “sex” : “男” }
可以在执行 JSON.stringify() 函数前将函数转换为字符串来避免以上问题的发生:
var myObject = { "name" : "lisi" , "age" : 18 , "sex" : "男" , "myFunction" : "function (){
return 99;}"
};
myObject.myFunction = myObject.myFunction.toString();
var myJSON = JSON.stringify(myObject);
提示:不建议在 JSON 中使用函数。
Java 对象和 JSON 数据的互相转换
当在服务器端通过一些操作获得许多的数据,我们希望把这些数据携带到客户端去,可以先将 Java 对象转换为 JSON,在通过一些方式发送到客户端。
可以自己转换,拼字符串,但是这样做太麻烦了。我们通过解析器来解决这个问题。
JSON解析器
常见的解析器: Jsonlib,Gson ,fastjson , jackson。
Java 对象转换 JSON
使用步骤:
导入 Jackson 的相关jar包
[]: https://mvnrepository.com/artifact/com.fasterxml.jackson.core
创建 Jackson 核心对象 ObjectMapper。
调用ObjectMapper 的相关方法进行转换。
转换方法:
writeValue(参数1,obj) :有很多的重载
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将数据填充到字节输入流中
OutputStream:将obj对象转换为JSON字符串,并将JSON数据填充到字节输出流中
writeValueAsString(obj) :将对象转换为JSON字符串
@Test
public void test1() throws Exception {
//创建Person对象
Person person = new Person();
person.setName("lisi");
person.setAge(18);
person.setSex("男");
//创建jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//转换
String myJson = mapper.writeValueAsString(person);
System.out.println(myJson);//{"name":"lisi","age":18,"sex":"男"}
//将数据写到D://a.txt文件中
mapper.writeValue(new File("D://a.txt"),person);
//将数据关联到Write中
mapper.writeValue(new FileWriter("D://a.txt"),person);
}
注解:
@JsonIgnore:排除属性
@JsonFormat:属性值的格式化
由于 JSON 不能转换 Date数据对象,转换后是一个时间戳,这不是我们期望的,可以通过@JsonIgnore来让其忽略该属性,如:
public class Person {
@JsonIgnore
private Date birth;
}
但是上面的这种思想是不对的,我们可以同@JsonFormat来指定要转换的格式:
public class Person {
//@JsonIgnore
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birth;
}
@Test
public void test2() throws JsonProcessingException {
//创建Person对象
Person2 person = new Person2();
person.setName("lisi");
person.setAge(18);
person.setSex("男");
person.setBirth(new Date());
//创建jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//转换
String myJson = mapper.writeValueAsString(person);
System.out.println(myJson);//{"name":"lisi","age":18,"sex":"男","birth":"2021-04-07"}
}
JSON 转换为 Java对象
使用步骤:
导入 Jackson 的相关jar包。
创建 Jackson 核心对象 ObjectMapper。
调用ObjectMapper 的相关方法进行转换。
readValue(json字符串,Class)
@Test
public void test3() throws IOException {
//创建JSON字符串
String myJson = "{\"name\":\"lisi\",\"age\":18,\"sex\":\"男\",\"birth\":\"2021-04-07\"}";
//创建jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//转换
Person2 myObject = mapper.readValue(myJson,Person2.class);
System.out.println(myObject.getName());//lisi
}
有错误请指出!谢谢!