RapidJson(V1.1.0)的Value简单操作(拼接json串,存取文件中的json,解析json串)

14人阅读 评论(0) 收藏 举报
分类:
#include <rapidjson/document.h>
#include <rapidjson/stringbuffer.h>
#include <rapidjson/pointer.h>
#include <rapidjson/writer.h>
#include <rapidjson/prettywriter.h>
#include <rapidjson/filereadstream.h>
//生成一串如下的json格式字符串,并解析
// {
// "name":"qfl",
// "age":20,
// "letter":["a","b","c"],
// "location": {"province":"fujian","city":"xiamen","number":16}
// "book":[{"name":"book1", "isbn":"123"},{"name":"book2","isbn":"456"}],
// "healthy":true,
// }

//生成Json串
rapidjson::Document jsonDoc;    //生成一个dom元素Document
rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); //获取分配器
jsonDoc.SetObject();    //将当前的Document设置为一个object,也就是说,整个Document是一个Object类型的dom元素

//添加属性
jsonDoc.AddMember("name", "qfl", allocator);    //添加字符串值
jsonDoc.AddMember("age", 20, allocator);        //添加int类型值

//生成array
rapidjson::Value letterArray(rapidjson::kArrayType);//创建一个Array类型的元素
letterArray.PushBack("a", allocator);
letterArray.PushBack("b", allocator);
letterArray.PushBack("c", allocator);
jsonDoc.AddMember("letter", letterArray, allocator);    //添加数组

//生成一个object
rapidjson::Value locationObj(rapidjson::kObjectType);//创建一个Object类型的元素
locationObj.AddMember("province", "fujian", allocator);
locationObj.AddMember("city", "xiamen", allocator);
locationObj.AddMember("number", 16, allocator);
jsonDoc.AddMember("location", locationObj, allocator);  //添加object到Document中

//生成一个object数组
rapidjson::Value bookArray(rapidjson::kArrayType);//生成一个Array类型的元素,用来存放Object
rapidjson::Value book1(rapidjson::kObjectType); //生成book1
book1.AddMember("name", "book1", allocator);
book1.AddMember("isbn", "123", allocator);
bookArray.PushBack(book1, allocator);           //添加到数组

rapidjson::Value book2(rapidjson::kObjectType); //生成book2
book2.AddMember("name", "book2", allocator);
book2.AddMember("isbn", "456", allocator);
bookArray.PushBack(book2, allocator);           //添加到数组
jsonDoc.AddMember("book", bookArray, allocator);

//添加属性
jsonDoc.AddMember("healthy", true, allocator);  //添加bool类型值
// jsonDoc.AddMember("sports", NULL, allocator);//添加空值,这里会导致报错

//生成字符串
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jsonDoc.Accept(writer);

std::string strJson = std::string( buffer.GetString() );
printf("-----生成的Json:\n%s", strJson.c_str());

//写到文件
std::string strPath ="C:\\JsonFile.txt";
FILE* myFile = fopen(strPath.c_str(), "w");  //windows平台要使用wb
if (myFile) 
{
	fputs(buffer.GetString(), myFile);
	fclose(myFile);
}


printf("-----读取Json内容:\n");
//从文件中读取(注意和上面分开,不能确定文件是否生成完毕,这里读取可能有问题)
rapidjson::Document newDoc;
std::string strPath ="C:\\JsonFile.txt";
FILE* myFile = fopen(strPath.c_str(), "r");   //windows平台使用rb
if (myFile) 
{
	char buffer[256];
	FileReadStream inputStream(myFile,buffer,sizeof(buffer));  //创建一个输入流
	newDoc.ParseStream<0>(inputStream); //将读取的内容转换为dom元素
	fclose(myFile); //关闭文件,很重要
}
//判断解析从流中读取的字符串是否有错误
if (newDoc.HasParseError()) 
{
	printf("Json Parse error:%d\n", newDoc.GetParseError()); //打印错误编号
}
else 
{
	//获取json串中的数据
	//先判断是否有这个字段,如果使用不存在的key去取值会导致直接崩溃
	if (newDoc.HasMember("name")) 
	{
		printf("name:%s\n", newDoc["name"].GetString()); //必须要获取对应的数据类型,rapidjson不会帮你转换类型
	}
	else 
	{}

	if (newDoc.HasMember("age")) 
	{
		printf("age:%d\n", newDoc["age"].GetInt());  //获取正确的类型
	}
	else 
	{}

	if (newDoc.HasMember("letter")) 
	{
		rapidjson::Value letter;    //使用一个新的rapidjson::Value来存放array的内容
		letter = newDoc["letter"];

		//确保它是一个Array,而且有内容
		if (letter.IsArray() && !letter.Empty()) 
		{
			//遍历Array中的内容
			for (rapidjson::SizeType i = 0; i < letter.Size(); i++) 
			{
				printf("letter:%s\n", letter[i].GetString());
			}
		}
		else 
		{}
	}
	else {}

	if (newDoc.HasMember("location")) 
	{
		rapidjson::Value location;      //使用一个新的rapidjson::Value来存放object
		location = newDoc["location"];

		//确保它是一个Object
		if (location.IsObject()) 
		{

			if (location.HasMember("province")) 
			{
				printf("location:province:%s\n", location["province"].GetString());
			}
			else {}
			if (location.HasMember("city")) 
			{
				printf("location:city:%s\n", location["city"].GetString());
			}
			else {}
			if (location.HasMember("number")) 
			{
				printf("location:number:%d\n", location["number"].GetInt());
			}
			else {}
		}
		else {}
	}
	else {}

	//book是一个包含了2个object的array。按照上面的步骤来取值就行
	if (newDoc.HasMember("book")) 
	{
		rapidjson::Value book;
		book = newDoc["book"];

		//先取Array
		if (book.IsArray() && !book.Empty()) 
		{
			rapidjson::Value tempBook;
			for (rapidjson::SizeType i = 0; i < book.Size(); i++) 
			{
				tempBook = book[i]; //Array中每个元素又是一个Object

				if (tempBook.IsObject()) 
				{

					if (tempBook.HasMember("name") && tempBook.HasMember("isbn")) 
					{
						printf("book:%d:name:%s, isbn:%s\n", i, tempBook["name"].GetString(), tempBook["isbn"].GetString());
					}
					else {}
				}
				else {}
			}
		}
		else {}
	}
	else {}

	if (newDoc.HasMember("healthy")) 
	{
		if (newDoc["healthy"].GetBool()) 
		{
			printf("healthy:true\n");
		}
		else 
		{
			printf("healthy:false\n");
		}
	}
	else {}
}

查看评论

Groovy 解析json和闭包的使用

最近项目在适合用groovy,发现groovy已经自带了很好的json解析工具。  先是访问第三方业务的rest服务,获取了json结果,然后解析结果进行下一步业务处理。这里只是贴出最基本的json解...
  • russle
  • russle
  • 2015-10-30 16:29:33
  • 4345

Groovy 处理JSON

Groovy自带了转换JSON的功能,相关类都在groovy.json包下。本文参考自Groovy文档 Parsing and producing JSON。首先我们定义两个简单的类。class Pe...
  • u011054333
  • u011054333
  • 2017-03-06 00:08:23
  • 5855

Groovy字符串及其常用方法

文本文字以字符链的形式表示被称作字符串。脚本语言在字符串处理方面比主流的应用程序开发语言做的更好。Groovy就提供了许多附加的特性。在Groovy中有两种风格的字符串:String(java.lan...
  • dora_310
  • dora_310
  • 2016-10-22 23:27:28
  • 16278

Groovy_遍历文件

Official documentation: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.htmlCommon M...
  • rainyRs
  • rainyRs
  • 2016-11-16 11:28:04
  • 1568

c++解析json文件: Rapidjson

#include "rapidjson/document.h" #include "rapidjson/prettywriter.h" #include "rapidjson/filestream.h...
  • u013242491
  • u013242491
  • 2014-10-05 00:30:16
  • 1860

cocos2d-x RapidJson解析json

Json是一种轻量级数据交换格式,具有易于人阅读和编写,同时也易于机器解析和生成。相较于XML,json更小、读写更快、更易解析。另一方面,Rapidjson作为json的升级版,在效率方面,具有更好...
  • houjia159
  • houjia159
  • 2015-02-09 16:29:34
  • 1209

java中的matches()方法

java.lang包中的String类,java.util.regex包中的Pattern,Matcher类中都有matches()方法。 都与正则表达式有关。下面我分别举例:(字符串:"abc",正...
  • luofuIT
  • luofuIT
  • 2016-05-18 10:56:12
  • 6686

正则表达式

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表...
  • u012129558
  • u012129558
  • 2017-11-09 17:49:02
  • 347

java解析和拼接json对象

[java] view plain copy  print? /**   * @author: helloworlda   * @time:2012-1-18    ...
  • bfboys
  • bfboys
  • 2016-12-15 21:58:27
  • 1561

如何使用rapidjson库进行json格式的封装及解析

一,字符串json封装及及解析的实例 #include "rapidjson/document.h" #include "rapidjson/prettywriter.h"   #inclu...
  • wangqing_12345
  • wangqing_12345
  • 2016-08-29 15:34:40
  • 9344
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 431
    排名: 11万+
    最新评论