json

json是基于Javascript语法的子集



  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号{}保存json对象
  • 中括号[]保存json数组,数组内容可以为对象


json数据书写格式为:key:value

例:"name":"zhangsan"

这条语句与JavaScript的语句等价:name:"zhangsan"



json的值可以是数字,字符串,逻辑值,数组,对象,null



json通常用于与服务器端交换数据,在接收数据时一般是字符串,下面学习基本的json对象内容和json字符串与JavaScript对象的转换



json对象

json对象在大括号中书写:

{

"key1":"value1"

"key2":"value2"

}

json如何访问对象值

var myObj, x;
myObj = { "name":"runoob", "alexa":10000, "site":null };
x = myObj.name;//x = myObj["name"];


使用点号来访问,也可以使用中括号访问。

嵌套json对象

myObj = {
"name":"runoob",
"alexa":10000,
"sites": {
"site1":"www.runoob.com",
"site2":"m.runoob.com",
"site3":"c.runoob.com"
}
}


修改json对象某属性的值

访问到+=+值:myObj.sites.site1 = "​​www.google.com​​";

如何删除某json对象的属性

delete+访问到:delete myObj.sites.site1;

json数组

json数组在中括号中书写:[ "Google", "Runoob", "Taobao" ]

json对象中的数组

对象属性的值可以是一个数组:

{
"name":"网站",
"num":3,
"sites":[ "Google", "Runoob", "Taobao" ]
}


如何访问json对象属性中的数组

使用索引值访问数组:x = myObj.sites[0];

json数组的其他操作

与json对象的操作类似

json与JavaScript对象转换(json解析)

JSON.parse()

JSON.parse(text[, reviver])


  • text:必需, 一个有效的 JSON 字符串。
  • reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

该方法将json字符串转换为JavaScript对象



例子

<p id="demo"></p>
<script>
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
document.getElementById("demo").innerHTML = obj.name + ":" + obj.site;
</script>


JSON.stringify()

使用JSON.stringify()将JavaScript对象转成json格式的字符串

JSON.stringify(value[, replacer[, space]])


参数说明:

  • value:
    必需, 要转换的 JavaScript 值(通常为对象或数组)。
  • replacer:
    可选。用于转换结果的函数或数组。
    如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。
    如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
  • space:
    可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。

例子

JavaScript对象转换

var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"};
var myJSON = JSON.stringify(obj);


结果:{"name":"runoob","alexa":10000,"site":"​​www.runoob.com​​"}

JavaScript数组转换

var arr = [ "Google", "Runoob", "Taobao", "Facebook" ]; var myJSON = JSON.stringify(arr);

结果:["Google","Runoob","Taobao","Facebook"]

注意

json不能存储Date对象

fastjson

将Java对象转换为json格式字符串:

为什么会转义:因为两种意义的双引号需要将其中一中前加/,避免系统识别错误

(1)创建JavaBean,在字段或getter、setter方法上添加@JSONField注解 (属性常用name,表示json对象的key,还有一些其他属性)加不加都行 (2)将Java对象转换为json对象: 使用JSON.toJSONString(Object object) a. 创建一个测试类 b. 声明JavaBean对象并实例化 c. 向Java对象中添加数据 d. String str = JSON.toJSONString(JavaBean) e. str即为转成的json字符串 f. JSON.toJSONString(Object object)方法也可以重载为 JSON.toJSONString(Object object, SerializerFeature... features)方法 后面的SerializerFeature参数的意义是是否将Java对象中没有添加的数据的 属性也放入json字符串中,显示为null或"" 注意:FastJSON在进行操作时,是根据getter和setter的方法进行的, 并不是根据注解,所以必须有getter和setter的方法,注解加不加都可以。

创建json对象

  1. 创建json对象

需要使用JSONObject(fastjson提供的json对象)和JSONArray(fastjson提供的json数组对象)对象

可以将JSONObject看成Map<String,Onject>

将JSONArray看成List<Object>,json对象的集合

@Test
public void a() throws ParseException {
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < 2; i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("AGE", 10);
jsonObject.put("FULL NAME", "Doe " + i);
jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
jsonArray.add(jsonObject);
}
String jsonOutput = jsonArray.toJSONString();
}


将json字符串转换成Java对象:

使用JSON.parseObject()

@Test
public void whenJson_thanConvertToObjectCorrect() {
Person person = new Person(20, "John", "Doe", new Date());
String jsonObject = JSON.toJSONString(person);
Person newPerson = JSON.parseObject(jsonObject, Person.class);
}


parseObject(String jsonString)---将一个json字符串解析成为jsonObject

将json数组解析成为Java集合对象

JSONObject jsonObject = JSONObject.parseObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("data");//得到json对象中data属性的值(该值是一个json对象数组)
/**
* 将json数组解析成为Java集合对象
*/
List<Movie> movies = jsonArray.toJavaList(Movie.class);