json---课程笔记


前两章我们探讨了XML的结构化数据,但开发人员还是觉得这种微型的数据结构还是过于烦琐、冗长。为了解决这个问题,JSON的结构化数据出现了。JSON是JavaScript的一个严格的子集,利用JavaScript中的一些模式来表示结构化数据。

一.JSON语法
JSON和XML类型,都是一种结构化的数据表示方式。所以,JSON并不是JavaScript独有的数据格式,其他很多语言都可以对JSON进行解析和序列化。
JSON的语法可以表示三种类型的值:
1.简单值:可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊值undefined2.对象:顾名思义。
3.数组:顾名思义。

简单值
100"Lee" 这两个量就是JSON的表示方法,一个是JSON数值,一个是JSON字符串。布尔值和null也是有效的形式。但实际运用中要结合对象或数组。

对象
JavaScript对象字面量表示法:
var box = {
    name : 'Lee',
    age : 100
};

而JSON中的对象表示法需要加上双引号,并且不存在赋值运算和分号:
{
    "name" : "Lee",                     //使用双引号,否则转换会出错
    "age" : 100
}

数组
JavaScript数组字面量表示法:
var box = [100, 'Lee', true];

而JSON中的数组表示法同样没有变量赋值和分号:
[100, "Lee", true]

一般比较常用的一种复杂形式是数组结合对象的形式:
[
    {
        "title" : "a",
        "num" : 1
    },
    {
        "title" : "b",
        "num" : 2
    },
    {
        "title" : "c",
        "num" : 3
    }
]

PS:一般情况下,我们可以把JSON结构数据保存到一个文本文件里,然后通过XMLHttpRequest对象去加载它,得到这串结构数据字符串(XMLHttpRequest对象将在Aajx章节中详细探讨)。所以,我们可以模拟这种过程。

模拟加载JSON文本文件的数据,并且赋值给变量。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';    

PS;上面这短代码模拟了var box = load('demo.json');赋值过程。因为通过load加载的文本文件,不管内容是什么,都必须是字符串。所以两边要加上双引号。

其实JSON就是比普通数组多了两边的双引号,普通数组如下:
var box = [{name : 'a', age : 1},{name : 'b', age : 2}];    

二.解析和序列化
如果是载入的JSON文件,我们需要对其进行使用,那么就必须对JSON字符串解析成原生的JavaScript值。当然,如果是原生的JavaScript对象或数组,也可以转换成JSON字符串。
对于讲JSON字符串解析为JavaScript原生值,早期采用的是eval()函数。但这种方法既不安全,可能会执行一些恶意代码。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
alert(box);                             //JSON字符串
var json = eval(box);                       //使用eval()函数解析
alert(json);                                //得到JavaScript原生值

ECMAScript5对解析JSON的行为进行规范,定义了全局对象JSON。支持这个对象的浏览器有IE8+、Firefox3.5+、Safari4+、Chrome和Opera10.5+。不支持的浏览器也可以通过一个开源库json.js来模拟执行。JSON对象提供了两个方法,一个是将原生JavaScript值转换为JSON字符串:stringify();另一个是将JSON字符串转换为JavaScript原生值:parse()。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';    //特别注意,键要用双引号
alert(box);                     
var json = JSON.parse(box);                         //不是双引号,会报错
alert(json);

var box = [{name : 'a', age : 1},{name : 'b', age : 2}];    //JavaScript原生值
var json = JSON.stringify(box);                     //转换成JSON字符串
alert(json);                                        //自动双引号

在序列化JSON的过程中,stringify()方法还提供了第二个参数。第一个参数可以是一个数组,也可以是一个函数,用于过滤结果。第二个参数则表示是否在JSON字符串中保留缩进。
var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, ['name', 'age'], 4);
alert(json);

PS:如果不需要保留缩进,则不填即可;如果不需要过滤结果,但又要保留缩进,则讲过滤结果的参数设置为null。如果采用函数,可以进行复杂的过滤。
var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, function (key, value) {
    switch (key) {
        case 'name' : 
            return 'Mr. ' + value;
        case 'age' : 
            return value + '岁';
        default : 
            return value;
    }
}, 4);
alert(json);

PS:保留缩进除了是普通的数字,也可以是字符。

还有一种方法可以自定义过滤一些数据,使用toJSON()方法,可以将某一组对象里指定返回某个值。
var box = [{name : 'a', age : 1, height : 177, toJSON : function () {
    return this.name;
}},{name : 'b',age : 2, height : 188, toJSON : function () {
    return this.name;
}}];
var json = JSON.stringify(box);
alert(json);                                

PS:由此可见序列化也有执行顺序,首先先执行toJSON()方法;如果应用了第二个过滤参数,则执行这个方法;然后执行序列化过程,比如将键值对组成合法的JSON字符串,比如加上双引号。如果提供了缩进,再执行缩进操作。

解析JSON字符串方法parse()也可以接受第二个参数,这样可以在还原出JavaScript值的时候替换成自己想要的值。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
var json = JSON.parse(box, function (key, value) {
    if (key == 'name') {
        return 'Mr. ' + value;
    } else {
        return value;
    }
});
alert(json[0].name);
var box = [
                    {
                        title : 'a',
                        num : 1,
                        height : 177,
                        toJSON : function () {
                            return this.title;
                        }
                    },
                    {
                        title : 'b',
                        num : 2,
                        height : 188,
                        toJSON : function () {
                            return this.title;
                        }
                    }
];
var json = JSON.stringify(box, null, 4);
alert(json);

*/




var json = '[{"title" : "a", "num" : 1},{"title" : "b", "num" : 2}]';   
var box = JSON.parse(json, function (key, value) {
    if (key == 'title') {
        return 'Mr.' + value;
    } else {
        return value;
    }
});
alert(box[0].title);




内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值