JSON
什么JSON:JavaScript Object Notation缩写,JavaScript对象格式化。简单说所谓JSON就是用JS语法表示的数据的一种格式。JSON就是数据,具有简单易懂,各语言都支持的特点。
JSON的本质就是数据,这个数据的类型是字符串
typeof json对象 //string
语法格式
简单值
数值、字符串、布尔值、null。
注意:JSON中没有undefined,JSON中的字符串必须用双引号
//下面四种数据只能同时选一种
1024
"hello world"
true
null
对象
{
"键(属性名)": 值(属性值),
"键": 值
}
注意:键必须用双引号包起来,且没有变量,后面不加分号
<script type="text/javascript">
var jsonobj = {"name":"peter", "age":25, "address":"北京"};
console.log(jsonobj.name);
console.log(jsonobj.age);
console.log(jsonobj.address);
jsonobj.address="天津";
console.log(jsonobj.address);
</script>
数组
JSON中的数组格式和JS中数组格式类似,格式:[值1, 值2, 值3…]
注意:没有数组名,后面不加分号
<script type="text/javascript">
var jsonarr = [{"name":"Tom", "age":25, "address":"天津"}, {"name":"Pnoy", "age":25, "address":"丰台"}];
console.log(jsonarr.length);
for (var i = 0; i < jsonarr.length; i++) {
console.log(jsonarr[i].name);
console.log(jsonarr[i].age);
console.log(jsonarr[i].address);
}
</script>
JS对象的序列化和JSON字符串的解析
需要用到一个全局的对象JSON对象,这个对象中有两个方法stringify方法、parse方法
JS对象的序列化:将JS对象转换为JSON字符串, 需要利用stringify方法
格式:JSON.stringify(js对象);
返回值:JSON字符串(用JSON语法表示的对象)
JSON字符串的解析:就是将JSON字符串转换为JS对象,需要利用parse方法
格式:JSON.parse(JSON字符串);
返回值:JS对象
stringify详细介绍
stringify方法的标准格式:JSON.stringify(js对象, 过滤器, 缩进长度),过滤器可以是一个数组,也可以是一个函数
- 如果是数组,格式:JSON.stringify(js对象, ["属性名", "属性名2"], 缩进长度); 在转化过程中数组中的键值对会被转换为JSON字符串,注意,如果属性值为undefined或者属性值为函数,那么该属性所在的键值对会被过滤掉
- 如果是一个函数,格式:JSON.stringify(js对象, function(key,value){ //函数体; });
stringify的第三个参数是用来设置代码缩进量的,默认为0个空格(可以省略不写),如果值大于等于1,那么会有自动换行效果,注意空格最多10个。另外第三个参数也可以是字符串,如”--”
<script type="text/javascript">
var obj = {
name: "Tom",
age: 18,
gender: "男"
}
var jsonarr = JSON.stringify(obj, ["name", "age"]); //数组形式,只转换name和age属性
console.log(jsonarr); //{"name":"Tom","age":18}
//函数形式,把name值更改为Pnoy,不转换age和gender属性
var jsonfun = JSON.stringify(obj, function(key, value) {
if (key == "name") {
return "Pony";
} else if (key == "age" || key == "gender") {
return undefined;
} else {
return value;
}
}, "---");
console.log(jsonfun); //{---"name":"Pony"}
</script>
parse详细介绍
parse方法的标准格式:JSON.parse(JSON字符串, function(key,value) { //对key和value的操作 });
<script type="text/javascript">
var jsonobj = '{"name":"Tom", "age":18, "gender": "男"}'; //JSON对象本质属于字符串,所以需要加单引号
var jsobj = JSON.parse(jsonobj, function(key, value) {
if (key == "name") {
return "Pony";
} else {
return value;
}
})
console.log(jsobj); //{name: "Pony", age: 18, gender: "男"}
</script>
eval函数将JSON文本解析成JS对象
在WEB应用程序中,请求和响应中只能传递JSON文本。
//JSON对象
var jsonobj = '{"name":"peter", "age":25}';
//JSON文本
var jsontxt = "{\"name\":\"peter\", \"age\":25}";
使用eval函数可以将JSON文本转换成对象
<script type="text/javascript">
var jsontxt = "{\"name\" : \"peter\",\"age\" : 25,\"address\" : \"北京\"}";
console.log(jsontxt);
var obj = eval("(" + jsontxt + ")"); //必须嵌套一层小括号
console.log(obj);
</script>
定义
eval() 可以接受一个字符串str作为参数,并把这个参数作为脚本代码来执行。
参数
如果参数是一个表达式,eval() 函数将执行表达式;
如果参数是Javascript语句,eval() 将执行 Javascript 语句;
如果执行结果是一个值就返回,不是就返回undefined,如果参数不是一个字符串,则直接返回该参数。
语法
eval(string)
eval("var a=1"); //声明一个变量a并赋值1
eval("2+3"); //执行加运算,并返回运算值
eval("mytest()"); //执行mytest()函数
eval("{b:2}"); //声明一个对象,如果想返回此对象,则需要在对象外面再嵌套一层小括如下:eval("({b:2})")
注意:使用eval来解析JSON格式字符串的时候,会将{}解析为代码块,而不是对象的字面量。
解决方案1,在JSON格式的字符串前面拼接上 "var o =";
解决方案2,把JSON格式的字符串使用()括起来,就不会将{}解析为代码块,而是表达式。
函数作用域
eval()函数并不会创建一个新的作用域,并且它的作用域就是它所在的作用域,有时候需要将eval()函数的作用域设置为全局,当然可以将eval()在全局作用域中使用,这个时候可以用window.eval()的方式实现。
异同点
共同点:都可以讲字符串转化为js代码
不同点:Function创建出来的函数,并不会直接调用,只有当手动去调用创建出来的函数的时候才,eval把字符串转化为代码后,直接就执行了。
Java中JSON对象的转化
简单的解析json字符串
首先将json字符串转换为json对象,然后再解析json对象,过程如下:
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
//根据json中的键得到它的值
String name = jsonObject.getString("name");
int num = jsonObject.getInt("num");
String sex = jsonObject.getString("sex");
int age = jsonObject.getInt("age");
将json字符串转换为java对象
同样先将json字符串转换为json对象,再将json对象转换为java对象,过程如下:
JSONObject obj = JSONObject.fromObject(jsonStr); //将json字符串转换为json对象
Person jb = (Person)JSONObject.toBean(obj,Person.class); //将json对象转换为Person对象
将java对象转换为json字符串
先将java对象转换为json对象,再将json对象转换为json字符串,过程如下:
JSONObject json = JSONObject.fromObject(obj); //将java对象转换为json对象
String str = json.toString();//将json对象转换为字符串
把Java数组转化为JSON对象
JSONArray jsonarr = JSONArray.fromObject(arr);