JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包,其在编程中作为一种通用的数据格式带给我们极大的方便。
JSON中,有两种结构:对象和数组。
object格式,用“{}”引起来的键值对:
var person= {"name":"jack"}
array格式,使用“[]”引起来的object:
var person = [{name:"trump", age:"71"},{name:"hillary", age:"70"}];
两种取值方法为别为对象时,直接“打点使用”,如:person.name。
为数组时根据索引使用,如person[1].age.
JSON对象和JSON字符串:
在数据传输过程中,JSON是以文本格式,即字符串的形式进行传递的,但是JavaScript操作的是JSON对象,所以,实际中常会遇到JSON对象和JSON字符串之间的相互转换。
ex:
// JSON字符串:
var jsonStr = '{ "name": "wade", "sex": "male" }';
// JSON对象:
var jsonObj = { "name": "Kristein", "sex": "female" };
简单的说,json字符串其实就是把json格式的文件用引号标识成字符串格式。
//由JSON字符串转换为JSON对象
var obj = eval('(' + str + ')');
var obj = str.parseJSON();
var obj = JSON.parse(str);
注意:如果obj本身就是一个对象,那么使用eval()转换后仍然是json对象,但是使用parseJSON会报异常,但是一般情况下不推荐使用eval(),因为它不安全。举个例子:
var jsonStr = '{name:"jack", action:"alert('unsafe')"};'
以上json字符串通过eval()转换后,获取action会直接弹出“unsafe”。
//JSON对象转换成字符串
var jsonStr = obj.toJSONString();
var jsonStr = JSON.stringfy(obj);
ps: 以上方法中,eval()是javascript自带的,其他的均来自于json.js包。新版本的json修改了API,将JSON.stringfy()和JSON.parse()两个转换方法加入了js的内建对象中,即可以直接使用。
最后补充一点:
需要读取一个json格式的文件时,其键名为数字或者非正常变量时如何操作呢?
先贴个小例子获取其中的json每条数据。
data.vue
export default {
data:function(){
return {
"2016Q1": [
{channel: '娱乐', vv: '17,980', dayrate: '+292%', weekrate: '+5%'},
{channel: '游戏', vv: '48,133', dayrate: '+48%', weekrate: '+21%'},
{channel: '动漫', vv: '189,342', dayrate: '+39%', weekrate: '+0%'},
{channel: '综艺', vv: '106,430', dayrate: '+35%', weekrate: '+12%'}
],
"2016Q2": [
{channel: '娱乐', vv: '43,910', dayrate: '+414%', weekrate: '+77%'},
{channel: '游戏', vv: '34,173', dayrate: '+28%', weekrate: '+11%'},
{channel: '动漫', vv: '89,562', dayrate: '+59%', weekrate: '+29%'},
{channel: '综艺', vv: '96,189', dayrate: '+37%', weekrate: '+0%'}
]
}
}
}
app.vue
import listData from './components/data'
export default {
name: 'app',
data(){
return{
lists: listData.data()["2016Q1"] //array
}
}
那么当json文件的的键名为数字时如何取值呢,如:
var testJson = {'9527':'soldiers'};
alert(testJson.9527);
这样写是无效的,不会弹出任何东西。
那么如何解决呢? 对于数字键名或者非正常变量字符(比如有空格),必须使用 obj[“key”]的方式。
回到上面,一般情况下可能会直接使用“this.lists = listData.data().2016Q1”来读取数据内容,然而在这里时无效的。
应该使用:
this.lists = listData.data()["2016Q1"];
ps:总结的比较仓促,难免疏忽,如有错误或遗漏,请指出。