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
    }

有错误请指出!谢谢!