JSON的解析和序列化

背景:XML曾经是互联网传输结构化数据的事实标准,但XML过于繁琐、冗长,而且解析麻烦,同XML数据结构要解析成DOM文档而且从中提取数据极为麻烦相比,JSON可以解析为JavaScript对象的优势极其明显。相比之下,JOSN是在JavaScript中读写结构化数据更好的方式,可以把JSON字符串直接传给eval(),而且不必创建DOM对象。JSON是一种数据格式,很多编程语言都有针对JOSN的解析器和序列化器。

一.JSON为JavaScript子集,可以使用eval解析JSON字符串,并返回JS对象/JS数组

var data = [
    {name: "小明", sex:1, age: 30},
    {name: "李雷", sex:0, age: 20},
    {name: "熊二", sex:1, age: 30}
];
//data对象的JSON字符串表示形式
var dataJSONText = "[{‘name‘: ‘小明‘, ‘sex‘:1, ‘age‘: 30},{‘name‘: ‘李雷‘, ‘sex‘:0, ‘age‘: 20},{‘name‘: ‘熊二‘, ‘sex‘:1, ‘age‘: 30}]";
console.log(eval("("+dataJSONText+")"));//即为data对象

需要注意的是对象在JSON字符串中表现形式的差异性(对象的属性必须加双引号,这在JSON中是必须的!)

 
//JavaScript对象在JSON中的表示形式:
var person = {
    name:"Nicholas",
    age:29
}; 

//JSON表示上述对象:
{
    "name":"Nicholas",
    "age":29
}

二.JSON虽然为JavaScript子集,但还是具有些差异性

  • 1.JSON不支持JavaScript中的特殊值undefined,但支持null
  • 2.JSON不支持变量、函数或对象实例

    三.全局JSON对象

    早期使用eval()函数进行JSON字符串的解析,后来ECMAScript5对解析JSON进行规范,定义了全局对象JSON,现在的浏览器基本都支持这个对象。

    JSON对象存在两种方法:

  • JSON.stringify()序列化js对象为JSON字符串

JSON.parse()将JSON字符串解析为JS对象

例1.基本应用:

var data = [
    {name: "小明", sex:1, age: 30},
    {name: "李雷", sex:0, age: 20},
    {name: "熊二", sex:1, age: 30}
];

//1.js对象序列化为json字符串
var str_json = JSON.stringify(data);
//2.json字符串解析为原生js对象
var data_copy = JSON.parse(str_json);

四.JSON.stringify序列化

JSON.stringify()还可以接收另外两个参数:第一个参数是过滤器、第二个参数是选项(是否在JSON字符串中保留缩进)

1.第一个参数是过滤器:

测试数据1:

//json对象转js对象,右侧为json对象
var data=[
    {
        "LBLCN": "事项",
        "FTYPE": "options",
        "TOOLTIP": "请选择事项",
        "REQD": false,
        "EDIT": "EVERYONE",
        "ITMS": [
            {
                "VAL": "选项 1"
            },
            {
                "VAL": "选项 2"
            },
            {
                "VAL": "选项 3"
            }
        ],
        "DEF": ""
    },
    {
        "LBLCN": "明细子表",
        "FTYPE": "detailTable",
        "FIELDS": [
            {
                "LBLCN": "多行文本",
                "FTYPE": "textarea",
                "TOOLTIP": "",
                "REQD": false,
                "EDIT": "EVERYONE"
            },
            {
                "LBLCN": "事项",
                "FTYPE": "options",
                "TOOLTIP": "请选择事项",
                "REQD": false,
                "EDIT": "EVERYONE",
                "ITMS": [
                    {
                        "VAL": "选项 1"
                    },
                    {
                        "VAL": "选项 2"
                    },
                    {
                        "VAL": "选项 3"
                    }
                ],
                "DEF": ""
            }
        ],
        "SCU": "pub"
    }]

过滤器是数组:

例2.

    //此时也要使VAL属性对应的上级属性ITMS也要显示,否则VAL显示不出来
    console.log(JSON.stringify(data,["VAL","FTYPE"]));
    //上级属性ITMS和下级属性VAL的先后顺序不会对过滤产生影响
    console.log(JSON.stringify(data,["ITMS","VAL","FTYPE"]));
    console.log(JSON.stringify(data,["VAL","ITMS","FTYPE"]));
    //同级属性FTYPE和ITMS的先后顺序,会影响过滤结果的先后顺序
    console.log(JSON.stringify(data,["FTYPE","VAL","ITMS"]));

测试数据2:

var book = {
    title:"Professional JavaScript",
    authors:[
        "Nicholas C. Zakas"
    ],
    edition:3,
    year:2011
};

过滤器是函数:

例3.

var jsonText = JSON.stringify(book, function(key, value) {
    switch (key) {
    case "authors":
        return value.join(",");
        //将数组连接成一个字符串
    case "year":
        return 5000;
    case "edition":
        return undefined;
        //通过返回undefined删除该属性
    default:
        return value;
        //其他属性正常序列化
    }
}
);
console.log(jsonText);//{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000}
函数参数为属性名(key)和属性值,根据属性名可以知道如何处理序列化中的属性,并且属性名只能是字符串。注意:当并非键值对结构时,键名可以是空字符串!(实际上第一次调用函数过滤器,传入的键是空字符串,而值是book对象!)
例4.
var data = {
    "LBLCN": "事项",
    "FTYPE": "options",
    "TOOLTIP": "请选择事项",
    "REQD": false,
    "EDIT": "EVERYONE",
    "ITMS": [
    "选项 1",
    "选项 2",
    "选项 3"
    ],
    "DEF": ""
}
var dataText = JSON.stringify(data, function(key, value) {
    switch (key) {
    case "ITMS":
        {
            var f = [];
            //js   for/in
            for (i in value) {
                f.push({
                    "VAL": value[i]
                });
            }
            return f;
        }
    case "VAL":
        return value + "test";
    default:
        return value;
    }
}
, 4);

console.log(dataText);

过滤原则:要序列化对象中的每一个对象都要经过过滤器函数(即使是转换后的对象,其属性和值也都要经过过滤)

2.第二个参数为字符串缩进

例4.

var book = {
    title:"Professional JavaScript",
    authors:[
        "Nicholas C. Zakas"
    ],
    edition:3,
    year:2011
};

jsonText = JSON.stringify(book,null,4);//使得JSON字符串包含缩进空格和换行符,增强可读性
jsonText = JSON.stringify(book,null,"--");//"--"作为缩进符

五.toJSON

若JSON.stringify()还无法满足对某些对象自定义序列化的需求,可通过每个对象可以自定义toJSON方法,实现自己的序列化方式,toJSON作为函数过滤器的补充。

例5.

    //Date 有自己的toJSON方法,返回值为字符串。故该对象将被序列化为一个简单字符串而非对象
    var date = new Date();
   console.log(date.toJSON());//2015-09-12T09:03:00.318Z

重难点:序列化对象的顺序(1.对象有自身的toJSON方法2.JSON.stringify()有过滤函数)

例6.

var person = {
    age:4,
    weight:"60kg",
    toJSON:function(){
        return {
            height:"1.8m"
        }
    }
};

var personText = JSON.stringify(person,function(key,value){
    switch(key){
        case "height":
            return value+" sss";
        default:
            return value;
    };
});

console.log(personText);//{"height":"1.8m sss"}

顺序是:先调用对象自身的toJSON方法进行序列化2.如果有过滤函数的话,再使用步骤1返回的对象,通过过滤函数进行序列化

六.JSON.parse

var book = {
    "title":"Professional JavaScript",
    "authors":[
        "Nicholas C. Zakas"
    ],
    edition:3,
    year:2011,
    releaseDate:new Date(2011,11,1)
};
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText,function(key,value){
    if(key == "releaseDate"){
        return new Date(value);
    }else{
        return value;
    }
});
console.log(bookCopy);
console.log(new Date());
时间: 2024-10-12 07:36:48

JSON的解析和序列化的相关文章

salesforce接收站点传过来的json,解析并序列化json,在保存到salesforce的个案以及测试类

@RestResource(urlMapping='/LiveChatTicketWebhook') global without sharing class LiveChatTicketWebhook { @httpPost global static void doPost() { //post请求 RestRequest req = RestContext.request; //响应 RestResponse res = RestContext.response; //解析请求到的body

JSON与js对象序列化

JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集.虽然是一个js的子集但是他与语言无关,它可以用于在现在所有的编程语言编写的应用程序之间进行数据交换.是一种文本格式,比较容易读写. json是一个容纳“名/值”对的无序集合,名字可以是任意字符串,值可以使任意的json类型的值.大多数编程语言都有被映射为json的数据类型,比 如对象(object),字典(dictionary)

《JAVASCRIPT高级程序设计》JSON语法/解析/序列化

JSON是一种数据格式,不是一种编程语言. 一.语法 JSON语法可以表示以下三种类型的值:简单值.对象.数组. 1.简单值 最简单的JSON数据值就是简单值: 5 "hello world" 2.对象 JSON对象与JAVASCRIPT字面量有些不同,以下是javascript中的对象字面量: // 表示方法1 var person = { name:"Lillian", age:24 }; // 表示方法2 var person1 = { "name&

JSON解析与序列化

JSON之所以流行,拥有与JavaScript类似的语法并不是全部原因.更重要的一个原因是,可以把JSON数据结构解析为有用的 JavaScript对象.与XML数据结构要解析成DOM文档而且从中提取数据极为麻烦相比,JSON可以解析为JavaScript对象的优势极其明 显. JSON对象 早期的JSON解析器基本上就是使用JavaScript的eval()函数.由于JSON是JavaScript语法的子集,因此eval()函 数可以解析.解释并返回JavaScript对象和数组.ECMASc

js解析与序列化json数据

一.前言:JSON对象有两个方法:stringify()和parse(). 二.介绍:在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript. 1.浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器: JSON.stringify(jsonobj);  //将json对象转换成json字符串 JSON.parse(jsonstr);  //将json字符串转换成jso

Java中使用Jackson进行JSON解析和序列化

Java中使用Jackson进行JSON解析和序列化 1.添加依赖,在Maven的pom.xml文件中添加以下依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency> 2.封装JSON解

js解析与序列化json数据(一)json.stringify()的基本用法

对象有两个方法:stringify()和parse().在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript; <html> <head> <title></title> <script type="text/javascript"> function init() { var book={ title:"JavaScript高级程序设计

JSON数据解析(转)

上篇随笔详细介绍了三种解析服务器端传过来的xml数据格式,而对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,那么本篇随笔将讲解一下json这个知识点,包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据,以及如何在我们的Android客户端解析来自服务器端的json数据,并更新到UI当中. 一.什么是json json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格

C#对JSON的处理和JSON在JS的序列化

JS对Json的处理 json2.js的源码地址: https://github.com/douglascrockford/JSON-js json2.js提供了json的序列化和反序列化方法,可以将一个json对象转换成json字符串,也可以将一个json字符串转换成一个json对象. 在页面中添加json2.js的引用. <script type="text/javascript" src="/CoreResource/JS/json2.min.js"&g