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;
}