JSON基础
Posted 再来半包
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON基础相关的知识,希望对你有一定的参考价值。
导读模块
发展史:21世纪初,Douglas Crockford寻找一种简便的数据交换格式,
能够在服务器之间交换数据。当时通用的数据交换语言是XML,
但是Douglas Crockford觉得XML的生成和解析都太麻烦,
所以他提出了一种简化格式,也就是Json。
JSON:是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
轻量级是指跟xml作比较。
数据交换指的是客户端和服务器之间业务数据的传递格式。
简而言之:是存储数据的一种方式/格式
与之类似的技术有:xml
JSON 语法规则
json的定义
json是由键值对组成,并且由花括号(大括号)包围。每个键由引号引起来,键和值之间使用冒号进行分割,多组键值对之间使用逗号进行分割。
var jsonObj={
"key1":12,
"key2":"abc",
"key3":true,
"key4":[11,"arr",false],
"key5":{
"key5_1":551,
"key5_2":"key5_2_value"
},
"key6":[{
"key6_1_1":6611,
"key6_1_2":"key6_1_2_value"
},{
"key6_1_1":6621,
"key6_1_2":"key6_2_2_value"
}]
}
json的访问
json本身就是一个对象
json中的key我们可以理解为是对象中的一个属性。
json中的key访问就跟访问对象的属性一样:json对象.key
alert(typeof (jsonObj));//Object json就是一个对象
alert(jsonObj.key1);//12
alert(jsonObj.key2);//abc
alert(jsonObj.key3);//true
alert(jsonObj.key4)//得到数组[11,"才",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
for (var j=0;j<jsonObj.key6.length;j++){
var jsonob=jsonObj.key6[j];//取出来每一个元素都是json对象
alert(jsonob.key6_1_1);
alert(jsonob.key6_1_2)
}
json的两个常用方法
json的两种存在形式
1、对象形式存在,json对象
2、字符串形式村子,json字符串
一般我们要操作json中的数据的时候,需要json对象的格式。
一般我们要在客户端和服务器之间进行数据交换的时候,使用json字符串。
json.stringify() 把json对象转换成json字符串
json.parse() 把json字符串转换成为json对象
JSON 在java中的使用
javaBean和json的互转
public void test1(){
Person person=new Person("杨过",1);
//创建Gson对象实例
Gson gson =new Gson();
//toJson方法可以把java对象转换成为Json字符串
String personJsonString=gson.toJson(person);
System.out.println(personJsonString);//{"name":"杨过","id":1}
//fromJson把字符串转换回java对象
//第一个参数是json字符串
//第二个参数是转换回去的Java对象类型
Person person1= gson.fromJson(personJsonString,Person.class);
//Person person2=gson.fromJson(personJsonString,person.getclass());
System.out.println(person1);//Person{name='杨过', id=1}
}
以上代码可以看到,在对一个对象进行toJson方法的时候,他会转变成一个Json字符串,但是如果想要转回java对象,则需要使用fromJson,而且参数为两个,第一个是Json字符串,第二个为java对象的类型,类名.class或者定义好的对象名.getclass()
List和json的互转
public void test2(){
List<Person> personList =new ArrayList<>();
//personList中添加两个Person对象
personList.add(new Person("杨过",1));
personList.add(new Person("小龙女",2));
Gson gson=new Gson();
//通过toJson()方法将List转换为Json字符串
String personListJsonString=gson.toJson(personList);
System.out.println(personListJsonString);
//通过fromJson()方法将Json字符串转为Java集合
//第一个参数为要转的Json字符串
//第二个参数为TypeToken<T>的匿名类
List<Person> list=gson.fromJson(personListJsonString,new TypeToken<List<Person>>(){}.getType());
System.out.println(list);
Person person = list.get(0);
System.out.println(person);
}
/*
运行结果
[{"name":"杨过","id":1},{"name":"小龙女","id":2}] Json字符串
[Person{name='杨过', id=1}, Person{name='小龙女', id=2}] Json字符串转回的List
Person{name='杨过', id=1} Json字符串转回List中的元素
*/
Json字符串转换为List与Json字符串转换为JavaBean不同在于from的第二个参数,转换为JavaBean需要javaBean类的class,而List 的话,第二个参数为一个TypeToken的匿名类,而这个泛型为List 的类型,也可以通过去定义一个ListType的类,去继承TypeToken类,在第二个参数后面进行new ListType这个TypeToken的子类实现Json字符串转回JavaList
map和json的互转
public void test3(){
Map<Integer,Person> personMap=new HashMap<>();
//为personMap集合中添加两个Person对象
personMap.put(1,new Person("磊哥",1));
personMap.put(2,new Person("航哥",1));
Gson gson = new Gson();
//把map集合转换成为Json字符串
String personMapJsonString =gson.toJson(personMap);
Map<Integer,Person> personMap1 = gson.fromJson(personMapJsonString, new TypeToken<Map<Integer,Person>>(){}.getType());
System.out.println(personMap1);
Person per=personMap1.get(1);
System.out.println(per);
}
/*
打印结果
{1=Person{name='磊哥', id=1}, 2=Person{name='航哥', id=1}}
Person{name='磊哥', id=1}
*/
Json字符串转回Map与Json字符串转回List大体一样,不同的就是new的TypeToken类的泛型,要与之要转回的类型相同
以上是关于JSON基础的主要内容,如果未能解决你的问题,请参考以下文章
json 可视代码工作室Angular with Firebase片段
错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”