JSON文件读取
一、JSON简介
JSON(JavaScript Object Notation) js对象标记,它来自JavaScript领域,是JavaScript的子集,专门用于指定结构化的数据。它基于 ECMA-262 标准。相比较于XML,JSON非常轻量级,可读性更好,扩展性也很强大。
网上有很多的JSON校验工具如:BeJson 、SoJson等。
示例:
// ./demo.json
{
"name":"网站",
"num":3,
"sites": [
{ "name":"Google", "info":[ "Android", "Google 浏览器", "TensorFlow" ] },
{ "name":"Runoob", "info":[ "Go 语言", "python", "JavaScript" ] },
{ "name":"Taobao", "info":[ "淘宝", "天猫" ] }
]
}
二、JSON文件读取
1、JavaScript
将从 .json 文件中读取到的文本字串转化为JavaScrip 对象,使用到的是JSON.parse
。另外是JSON.stringify
它将JavaScript对象转化为字符串。
示例:
// node.js
var fs = require('fs');
var file = './demo.json';
var request = JSON.parse(fs.readFileSync(file));
var x = ""
for (i in request.sites){
x = request.sites[i].name;
y = request.sites[i].info;
z = x + ': ' + y
console.log(z)
}
输出结果:
Google: Android,Google 浏览器,TensorFlow
Runoob: Go 语言,python,JavaScript
Taobao: 淘宝,天猫
注意一下几点异常情况:
- JSON 不能存储 Date 对象。所以需要将其转换为字符串。之后再将字符串转换为 Date 对象。也可以启用 JSON.parse 的第二个参数 reviver,对象的Date成员调用此函数,进行转换
// html+js
var text = '{ "name":"kaliopenxtu", "initDate":"2017-7-10"}';
var obj = JSON.parse(text, function (key, value) {
if (key == "initDate") {
return new Date(value);
} else {
return value;
}});
document.getElementById("demo").innerHTML = obj.name + "创建日期:" + obj.initDate;
- JSON 不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数。转换成函数使用
eval()
- JSON 不能存储 Date 对象。JSON.stringify() 会将所有日期转换为字符串。
- JSON 不允许包含函数,JSON.stringify() 会删除 JavaScript 对象的函数,包括 key 和 value。执行 JSON.stringify() 函数前将函数用
.toString()
转换为字符串来避免以上问题的发生.
2、python
从python2.6 开始,通过标准库 json
模块开始正式支持JSON,基本上是simplejson
库的集成版。模块提供了函数dumps()和loads()实现字典转json字符串和json字串转字典,另外也提供了encoder类和decoder类。
示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from pprint import pprint
fs = open('./demo.json', 'r', encoding='utf-8')
jsontext = fs.read()
pprint('--------- text --------\n' + jsontext)
dict_json = json.loads(jsontext)
print('\n--------- dict --------')
pprint(dict_json)
print('\n--------- str --------')
for i in dict_json['sites']:
pprint(i['name'] + ': ' + str(i['info']))
输出结果:
('--------- text --------\n'
'{\n'
' "name":"网站",\n'
' "num":3,\n'
' "sites": [\n'
' { "name":"Google", "info":[ "Android", "Google 浏览器", "TensorFlow" ] '
'},\n'
' { "name":"Runoob", "info":[ "Go 语言", "python", "JavaScript" ] },\n'
' { "name":"Taobao", "info":[ "淘宝", "天猫" ] }\n'
' ]\n'
'}')
--------- dict --------
{'name': '网站',
'num': 3,
'sites': [{'info': ['Android', 'Google 浏览器', 'TensorFlow'], 'name': 'Google'},
{'info': ['Go 语言', 'python', 'JavaScript'], 'name': 'Runoob'},
{'info': ['淘宝', '天猫'], 'name': 'Taobao'}]}
--------- str --------
"Google: ['Android', 'Google 浏览器', 'TensorFlow']"
"Runoob: ['Go 语言', 'python', 'JavaScript']"
"Taobao: ['淘宝', '天猫']"
3、C++
使用了库JSONCPP
GitHub: https://github.com/open-source-parsers/jsoncpp
编译库lib: http://blog.youkuaiyun.com/crazyer2010/article/details/8962449
使用方法详解:http://blog.youkuaiyun.com/yc461515457/article/details/52749575
注意:
在编译 json 的lib时,可能会报“stdint.h’: No such file or directory”,此时你可以将 config.h
中的#include<stdint.h>
注释掉,手动添加typedef int64_t, uint64_t
,如下:
// @ file: config.h
//#include <stdint.h> //typedef int64_t, uint64_t
typedef long long int64_t;
typedef unsigned long long uint64_t;
原因是:‘stdint.h’是C99标准的库,而VS2008没有,但是根据config.h使用此头文件的目的是typedef int64_t, uint64_t,所以我们只需手动实现它即可成功编译连接,应该不会再报这个错误。
简单示例:
demo.json
// demo.json
{
"id" : 123,
"name" : "kali"
}
//mian.cpp
#include "stdafx.h"
#include <fstream>
#include <cassert>
#include "json.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifs;
ifs.open("demo.json");
assert(ifs.is_open());
Json::Reader reader;
Json::Value root;
if (!reader.parse(ifs, root, false))
{
return -1;
}
string name = root["name"].asString();
int age = root["id"].asInt();
cout<<name<<endl;
cout<<age<<endl;
system("pause");
return 0;
}
输出结果:
kali
123
三、异常
jsoncpp 解析json文件时,如果有中文等会乱码。待解决。。。