尚硅谷JavaWeb笔记——JSON(一文包教会使用JSON)

JSON

JSON(JavaSrcipt Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JSON采用完完全独立于语言的文本格式,而且很多语言都提供了对json的支持(包括C++等),这使得JSON成为理想的数据交换语言

json是一种轻量级的数据交换格式

  • 轻量级是跟xml做比较
  • 数据交换指的是客户端和服务器之间业务数据传递格式

JSON在JavaScript中的使用

json的定义

定义规范:json是由键值对组成,并且由{}包围,每个键由""引号连起来,键和值之间使用:分割,多组键值对之间使用进行分割

在html页面中安如下方式写

<script type="text/javascript">
			// json的定义
			var jsonObj = {
				"key1":12,						// 数值
				"key2":"abc",					// 字符串
				"key3":true,					// 布尔类型
				"key4":[11, "arr", false],		// 数组
				"key5":{						// json类型
					"key6_1":551,				// 一个json中元素中的第一个json元素
					"key5_2":"key5_2_value"		// 一个json中的第二个json元素
				},
				"key6":[{						// json数组,数组中有两个json元素,每个json元素中又包含两个json
					"key6_1_1":6611,
					"key6_1_2":6612
				},{
					"key6_2_1":6621,
					"key6_2_2":6622
				}]
			};
			alert(typeof(jsonObj));// object  json就是一个对象
</script>

json就是一些列键值对,值可以是任意数值类型。每个json都是一个对象。

json的访问

上文提到每个json都是一个object类型,二每一个key值都是对象的一个属性,因此json中key的访问就跟访问对象的属性一样采用.来访问,具体如下:

alert(jsonObj.key1); //12
alert(jsonObj.key2); // abc
alert(jsonObj.key3); // true

alert(jsonObj.key4);// 得到数组[11,"arr",false]
// json 中 数组值的遍历
for (var i = 0; i < jsonObj.key4.length; i++) {
  alert(jsonObj.key4[i])
}

alert(jsonObj.key5.key5_1);//551
alert(jsonObj.key5.key5_2);//key5_2_value

var jsonItem = jsonObj.key6[0];
alert( jsonItem.key6_1_1 ); //6611
alert( jsonItem.key6_1_2 ); //6612

json的成员方法

json的存在又两种形式(可以相互转换

  • 对象的存在,称其为json对象。一般在需要操作json数据的时候使用
  • 字符串的形式存在,称其为json字符串,一般在客户端和服务端之间进行数据交换时使用

转换方法:

  • JSON.stringify():把json对象转换为json字符串
  • JSON.parse():把json字符串转换为json对象
// json对象转字符串
// 把json对象转换成为 json字符串
var jsonstringify = JSON.stringify(jsonObj);// 特别像 Java中对象的toString
alert(jsonstringify);


// json字符串转json对象
// 把json字符串。转换成为json对象
var jsonObj2 = JSON.parse(jsonstringify);
alert(jsonObj2);
alert(jsonObj2.key1);// 12
alert(jsonObj2.key2);// abc

JSON在Java中的使用

java中操作json需要导入jar包

javaBean和json的互转

上述jar包中的gson对象实例中的两个方法toJson()以及fromJson()可以实现该过程

/**
     * 1.2.1、javaBean和json的互转
     */
@Test
public void test1(){
  Person person = new Person(1, "tom");
  // 创建Gson对象实例
  Gson gson = new Gson();
  // toJson方法可以把java对象转换成为json字符串
  String personJsonString = gson.toJson(person);
  System.out.println(personJsonString);		 //{"id":1,"name":"gjs"}

  // fromJson把json字符串转换回Java对象
  // 第一个参数是json字符串
  // 第二个参数是转换回去的Java对象类型
  Person person1 = gson.fromJson(personJsonString, Person.class);
  System.out.println(person1);						//Person{id=1, name='gjs'}
}

List和json的互换

/**
     * 1.2.2、List 和json的互转
     */
@Test
public void test2(){
  List<Person> personList = new ArrayList<>();
  personList.add(new Person(1, "gjs"));
  personList.add(new Person(2, "ylk"));

  Gson gson = new Gson();

  // 把List转换为json字符串
  String personListJsonString = gson.toJson(personList);
  System.out.println(personListJsonString);

  List<Person> json = gson.fromJson(personListJsonString, new PersonListType().getType());
  System.out.println(json);
}

注意,在获取List<Person>类的时候,不能直接写List(Person).getClass(),这会出错,需要按照gson规范的方式来写,也就是第16行的代码。该类需要继承gson提供的规范。

public class PersonListType extends TypeToken<ArrayList<Person>> {}

map和json的互换

/**
     * 1.2.3、map 和json的互转
     */
@Test
public void test3(){
  Map<Integer, Person> personHashMap = new HashMap<>();
  personHashMap.put(1, new Person(1, "gjs"));
  personHashMap.put(2, new Person(2, "ylk"));

  Gson gson = new Gson();

  // 把 map 集合转换成为 json字符串
  String personMapJsonString = gson.toJson(personHashMap);
  System.out.println(personMapJsonString);

  //  Map<Integer, Person> personMap2 = gson.fromJson(personMapJsonString, new PersonMapType().getType());
  Map<Integer, Person> personMap2 = gson.fromJson(personMapJsonString, new TypeToken<Map<Integer, Person>>(){}.getType());

  System.out.println(personMap2);
  Person p1 = personMap2.get(1);
  System.out.println(p1);
}
  • 说明,如果每一个新定义的集合类都定一个类的话就会很冗余,于是这里可以使用匿名内部类的方式,构建TypeTokenl类的匿名内部类对象,然后获取其类型

    new TypeToken<Map<Integer, Person>>(){}.getType()
    

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值