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 文件中读取到的文本字串转化为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()转换为字符串来避免以上问题的发生.从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: ['淘宝', '天猫']"使用了库JSONCPP
GitHub: https://github.com/open-source-parsers/jsoncpp 编译库lib: http://blog.csdn.net/crazyer2010/article/details/8962449 使用方法详解:http://blog.csdn.net/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文件时,如果有中文等会乱码。待解决。。。
