JSON文件读取

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文件时,如果有中文等会乱码。待解决。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值