Jsoncpp使用概要VS2019


JSONの構文解析を使用するには、最近の研究の必要性、使用にはいくつかの問題に遭遇し、総括する必要性を感じます

JSONをパースする文字列から

    const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
	Json::CharReaderBuilder b;
	Json::CharReader* reader(b.newCharReader());
	Json::Value root;
	JSONCPP_STRING errs;
	bool ok = reader->parse(str, str + strlen(str), &root, &errs);

	std::string upload_id;
	int code = 0;
	if (ok && errs.size() == 0)
	{
		upload_id = root["uploadid"].asString();  // 访问节点,upload_id = "UP000000"  
		code = root["code"].asInt();    // 访问节点,code = 100  
	}
	else
	{
		cout << "ok=" << ok << ",errs.size()=" << errs.size() << endl;
	}
	delete reader;

JSONを解析するファイルから


    Json::CharReaderBuilder rbuilder;
	rbuilder["collectComments"] = false;
	Json::Value root_group;
	JSONCPP_STRING errs;
	fstream f;
	f.open("d:\\test.json", ios::in);
	if (!f.is_open())
	{
		cout << "ReadJsonFromFile Open json file error!" << endl;
		return -1;
	}
	bool parse_ok = Json::parseFromStream(rbuilder, f, &root_group, &errs);

	if (!parse_ok)
	{
		cout << "ReadJsonFromFile Parse json file error!" << endl;
		f.close();
		return -1;
	}
	else
	{
		cout << "ReadJsonFromFile success!" << endl;
	}
	f.close();

JSONファイルを書きます

    Json::Value root_group;
	for (int i = 0; i < 5; ++i) 
	{
		root_group[i]["Age"] = 20;
		root_group[i]["ID"] = i;
	}
	fstream f;
	f.open("d:\\test.json", ios::out | ios::trunc);
	if (!f.is_open())
	{
		cout << "WritrJsonToFile Open file error!" << endl;
		return -1;
	}
	f << root_group.toStyledString(); 
	f.close();

JSON出力文字列

公式サイトでは唯一の書き込みコードへの出力ニーズをフォーマットする必要はありません文字のこの文字列をtoStyledString()メソッドの出力を提供します。次のように()は、ソースコードのtoStyledString。

    String Value::toStyledString() const {
		StreamWriterBuilder builder;

		String out = this->hasComment(commentBefore) ? "\n" : "";
		out += Json::writeString(builder, *this);
		out += '\n';

		return out;
	}

StreamWriterBuilderは、ソースコードを表示する、デフォルトの設定では、出力JSONフォーマットした「\トン」にあります。そして、提供StreamWriterBuilderは方法をフォーマット提供します。以下のソースコードに基づいてtoStyledString(に基づいて加え、toString()メソッド)。

    String Value::toString() const {
		StreamWriterBuilder builder;
		builder.settings_["indentation"] = ""; //设置格式化字符串为空格
		String out = this->hasComment(commentBefore) ? "\n" : "";
		out += Json::writeString(builder, *this);
		//out += '\n';//去掉最后的换行符
		return out;
	}

UTF8をコードさらにJSONCPPデフォルトは、VSのデフォルトエンコーディングと矛盾する入力中国語、StreamWriterBuilderはのtoString()、次のコードを過負荷、符号化パラメータのデフォルトを提供する場合、歪みが発生します。

	String Value::toString(const bool emitUTF8) const {
		StreamWriterBuilder builder;
		builder.settings_["indentation"] = ""; //不格式化输出开始
		builder.settings_["emitUTF8"] = emitUTF8; //非UTF8编码填true
		String out = this->hasComment(commentBefore) ? "\n" : "";
		out += Json::writeString(builder, *this);
		return out;
	}

過toStyledString()、次のコード

    String Value::toStyledString(const bool emitUTF8) const {
		StreamWriterBuilder builder;
		builder.settings_["emitUTF8"] = emitUTF8; //非UTF8编码填true
		String out = this->hasComment(commentBefore) ? "\n" : "";
		out += Json::writeString(builder, *this);
		out += '\n';

		return out;
	}
出版元の記事 ウォンの賞賛1 ビュー15

おすすめ

転載: blog.csdn.net/qq_14847103/article/details/104062765