JsonCpp——json文件的解析

定义:

  官网: http://json.org/
  在线解析器:http://json.cn/ http://www.bejson.com/
  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON 采用完全独
立于程序语言的文本格式,但是也使用了类 C 语言的习惯(包括 C, C++, C#, Java, JavaScript,Perl, Python 等)。这些特性使 JSON 成为理想的数据交换语言。

解释格式:

一个json实例

{
  "animals": {
            "dog": [
                        {"name": "Rufus", "age": 15},
                        {"name": "Marty","age": null}
                      ],
            "cat": [
                        {"name": "bosi","age": 15},
                        {"name": "maowang","age": null}
                    ]
               }
}                                    

文档结构分析:

  json 简单说就是 javascript 中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。

1)对象(Object)
  对象在 js 中表示为“{}”括起来的内容, 数据结构为 {key: value,key: value,...}的键值对的结构, 在面向对象的语言中, key 为对象的属性, value 为对应的属性值, 所以很容易理解, 取值方法为 对象.key 获取属性值, 这个属性值的类型可以是 数字、字符串、 数组、 对象几种。

2)数组(Array)

  数组在 js 中是中括号“[]”括起来的内容, 数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样, 使用索引获取, 字段值的类型可以是 数字、 字符串、数组、 对象几种。

3)数据类型

  • 值(value)

  值( value) 可以是双引号括起来的字符串( string) 、 数值(number)、 true、 false、null、 对象( object) 或者数组( array) 。 这些结构可以嵌套。

    eg:“abc”, { “abc”:123} [1,2,3] true false null

  • 字符串:

  字符串( string) 是由双引号包围的任意数量 Unicode 字符的集合, 使用反斜线转义。 一个字符( character) 即一个单独的字符串( character string) 。 

  eg:“abc” “\r\n” “u00A9”

  • 数值

  数值( number) 也与 C 或者 Java 的数值非常相似。 只是 JSON 的数值没有使用八进制与十六进制格式。 

  eg:123 -123 1.234e5

JsonCpp

简介
JSON is a lightweight data-interchange format. It can represent numbers,strings, ordered sequences of values, and collections of name/value pairs.JsonCpp is a C++ library that allows manipulating JSON values, including serialization and deserialization to and from strings. It can also preserve existingstore user input files.

JsonCpp环境搭建:

下载地址:

https://github.com/open-source-parsers/jsoncpp#generating-amalgamated-source-and-header

Qt JsonCpp 安装
① 解压 jsoncpp-master.zip 包
② 在根目录下, 运行 python amalgamate.py
③ 在根目录中生成 dist 文件夹包含三个文件 dist/json/json-forwards.h
dist/json/json.h dist/json.cpp
④ 在 Qt 工程目录下, 生成 json 文件夹, 并拷贝 json 目录下。
⑤ 在 Qt 工程中添加现有文件即可。

JSon 框架
Json::Value 是 jsoncpp 中最基本、最重要的类,用于表示各种类型的对象。
Json::Reader 用来将内存或文件中的 json 数据转换成 Json::Value 类型。
Json::Writer 用来将 Json::Value 类型转换成内存或文件中的 json 数据。

读写 Json
1)写:

#include <iostream>
#include <fstream>
#include "json/json.h"
using namespace Json;
using namespace std;
#if 0
{
  "animals": {
            "dog": [
                        {"name": "Rufus", "age": 15},
                        {"name": "Marty","age": null}
                      ],
            "cat": [
                        {"name": "bosi","age": 15},
                        {"name": "maowang","age": null}
                    ]
               }
}              

#endif

void writeTestJson()
{
  //对象的创建
  Value map;
  map["key1"] = 1;
  map["key2"] = "1";
  map["key3"] ;
  //数组的创建
  Value arr;
  Value item;
  for(int i=0; i<10; i++)
  {
    item["key"] = 1;
    item["key2"] = 2;
    arr.append(item);
  }   string str = arr.toStyledString();
  cout<<str;
} 

void writeJson()
{
  Value dogArr;
  Value Item;
  Item["name"] = "Rufus";Item["age"] = 15;
  dogArr.append(Item);
  Item["name"] = "Marty";Item["age"];
  dogArr.append(Item);
  Value catArr;
  Item["name"] = "bosi";Item["age"] = 15;
  catArr.append(Item);
  Item["name"] = "maowang";Item["age"];
  catArr.append(Item);
  Value rootValue;
  rootValue["dog"] = dogArr;
  rootValue["cat"] = catArr;
  Value root;
  root["anmials"] = rootValue;
  string str = root.toStyledString();
  cout<<str;
  ofstream ofs("animal.json");
  ofs<<str;
  ofs.close();
} 

int main()
{
  writeJson();
  return 0;
}

2)读

void readJson()
{
  ifstream ifs("animal.json");
  if(!ifs)
  cout<<"open error"<<endl;
  Value root;
  Reader reader;
  if(reader.parse(ifs,root))
  {
    cout<<root.toStyledString()<<endl;
    Value &arr = root["animals"]["dog"];
    for(int i=0; i<arr.size(); i++)
    {
      cout<<"name"<<arr[i]["name"]<<endl;
      cout<<"age "<<arr[i]["age"]<<endl;
    }    arr = root["animals"]["cat"];
    for(int i=0; i<arr.size(); i++)
    {
      cout<<"name"<<arr[i]["name"]<<endl;
      cout<<"age "<<arr[i]["age"]<<endl;
    }
  }
}

3)改

void readWriteJson()
{
  ifstream ifs("animal.json");
  if(!ifs)
  cout<<"open error"<<endl;
  Value root;
  Reader reader;
  if(reader.parse(ifs,root))
  {
    cout<<root.toStyledString()<<endl;
    Value &arr = root["animals"]["dog"];
    root["person"];
    root["animals"]["tiger"];
    root["animals"].removeMember("dog");
    cout<<root.toStyledString()<<endl;
    root.removeMember("animals");
    cout<<root.toStyledString()<<endl;
  }
}

int main()
{
  readWriteJson();
  return 0;
}

原文地址:https://www.cnblogs.com/wangkeqin/p/9279470.html

时间: 2024-08-22 04:40:34

JsonCpp——json文件的解析的相关文章

IOS开发网络篇-JSON文件的解析

一.什么是JSON数据 1.JSON的简单介绍 JSON:是一种轻量级的传输数据的格式,用于数据的交互 JSON是javascript语言的一个子集.javascript是个脚本语言(不需要编译),用来给HTML增加动态功能. javascript和java没有半毛钱的关系! 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外). 2.JSON的语法规则 <1> 数据以键值的方式保存; 键(key)必须用双引号("key"),与键值之间以':'分隔;

Json文件/网址解析

// // main.m // OC8-Json文件解析 // // Created by qianfeng on 15/6/23. // Copyright (c) 2015年 qianfeng. All rights reserved. // #import <Foundation/Foundation.h> //Json //Javascript 语法的子集 //key : value 类似OC中的键值对 //1.json文件 的最外层结构通常为字典或者数组,以字典居多. //2.jso

cocos2dx 2.2.2 cocostudio 数据编辑器导出的.json文件读取 解析

首先,创建 然后 再导出数据: 再然后,能够看到数据的格式是: 再然后,就是 数据解析代码: [cpp] view plaincopy ////////////////// rapidjson::Document _doc; bool bRet = false; unsigned long size = 0; unsigned char *pBytes = NULL; do { pBytes = cocos2d::CCFileUtils::sharedFileUtils()->getFileDa

Libgdx 之JSON文件解析

上一节我们学习了XML文件的解析,接下来我们再了解JSON文件的解析.在Libgdx中也提供了Json类来帮助我们解析文件,最常用的方法是fromJson(java.lang.Class type, FileHandle file) 通过此方法我们必须先定义一个内部类来抽象的表示Json文件. { "name": "David", "experience": 2534, "strength": 6, "dexteri

一行代码解析复杂JSON文件:利用Android自带的包解析JSON

上周写了一篇关于Android自带的org.JSON与JSONLIB相冲突的文章,今天我想写一下我对org.json使用的小心得 由于学校项目要求解析一个复杂JSON,所以就上网搜了一下,不过Google一搜JSON数据解析,会出现五花八门的结果,JSONLIB, GSON, FASTJSON等等,唯独没有对org.json的使用,其实Android自带的JSON解析包相当好用,其用法与JSONLIB类似,我是先用的JSONLIB,在JRE环境下用得好好的,到了Android下怎么都跑不通(原来

iOS 如何用JSONKit读写JSON文件

如何用JSONKit读写JSON文件 分类: ios2013-04-20 12:46 510人阅读 评论(0) 收藏 举报 JSON文件格式简单,使用方便,值得一用. 目前已经有多个库支持Json文件的解析,在这之中,JSONkit用起来方便,而且效率比较高,本文介绍的就是JSONKit的使用方法. 1.准备工作 下载JSONKit包:http://download.csdn.net/detail/enuola/4523160 2.写json文件 创建文件 //创建文件目录以及文件,需要用到fi

java实现服务端守护进程来监听客户端通过上传json文件写数据到hbase中

1.项目介绍: 由于大数据部门涉及到其他部门将数据传到数据中心,大部分公司采用的方式是用json文件的方式传输,因此就需要编写服务端和客户端的小程序了.而我主要实现服务端的代码,也有相应的客户端的测试代码.这里须有一个需要提到的是,我在实现接收json文件的同时,而且还需将数据写到hbase中.写入到hbase当中采用的是批量插入的方式,即一次插入多条记录. 好了,有了前面的说明,下面来简单的说一下我实现的服务端的小程序把. 2.为了实现服务端能够监听客户端的行为,因此我在服务端采用多线程的技术

C++通过jsoncpp类库读写JSON文件

JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择.JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考http://www.json.org/. 本教程选择第三方库jsoncpp来解析json, jsoncpp是比较出名的c++解析库,在json官网也是首推的. jsoncpp下载地址:http://download.csdn.net/deta

C++ Jsoncpp源代码编译与解析Json

1.Json 数据表示方式介绍 这个可以看之前的一个文章里面有说明:Java解析(读取)Json数据 2.C++ Jsoncpp 2.1 Jsoncpp介绍 (1)JsonCpp主要包含三种类型的class:Value Reader Writer; Json::Value 是jsoncpp 中最基本.最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值. Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json: