C++ Builder 生成 json,Json::StreamWriterBuilder 参数详解

jsoncpp 最新版本为 master 分支,必须用新版本的支持 C++ 11 的编译器,C++ Builder 需要选择 clang 编译器,不可以使用 Borland 编译器。
下载和编译 jsoncpp 可以参考《C++ Builder 编译 jsoncpp 库 (master 分支)》
使用 jsoncpp 库和解析 json 请参考 《C++ Builder 解析 json,Json::CharReaderBuilder 的使用方法》

  • 使用 jsoncpp 静态库
  • 生成 json 对象
  • 生成 json 字符串
    控制 json 缩进 / 压缩格式的 json
    直接输出 UTF-8 字符 / 转义输出 UTF-8 字符
    浮点数的输出类型和精度
    浮点数 NAN, +INF, -INF 的输出方式
    是否输出 NULL 值
    是否输出注释
    控制冒号前后的空格,YAML 兼容格式
  • 保存 json文件
  • 下载本文例子

一. 使用 jsoncpp 静态库

使用 jsoncpp 库和解析 json 请参考 《C++ Builder 解析 json,Json::CharReaderBuilder 的使用方法》

二. 生成 json 对象

例:要生成这样的 json:

{
   "data" : 12345,
   "error" : [
      {
         "描述" : "故障1",
         "编码" : "101"
      },
      {
         "描述" : "故障2",
         "编码" : "102"
      }
   ]
}

代码如下:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data"] = 12345;
    J["error"][0][UTF8String(L"编码").c_str()] = UTF8String(L"101" ).c_str();
    J["error"][0][UTF8String(L"描述").c_str()] = UTF8String(L"故障1").c_str();
    J["error"][1][UTF8String(L"编码").c_str()] = UTF8String(L"102" ).c_str();
    J["error"][1][UTF8String(L"描述").c_str()] = UTF8String(L"故障2").c_str();

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["emitUTF8"] = true;
    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

运行结果:生成的 json

前面的代码是通过 json 根节点直接创建 json 字符串,下面代码是通过中间变量创建:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    typedef struct
    {
        const wchar_t *sCode;
        const wchar_t *sDesc;
    }   TErrorInfo;

    static const TErrorInfo EInfo[] =
    {
        { L"101", L"故障1" },
        { L"102", L"故障2" },
        { NULL  , NULL     },
    };

    Json::Value J; // 要生成的 json 对象
    J["data"] = 12345;

    Json::Value &jsError = J["error"]; // 注意要引用 json 对象

    for(int i=0; EInfo[i].sCode; i++)
    {
        const TErrorInfo &EI = EInfo[i];
        Json::Value &jsErrInfo = jsError[i]; // 注意要引用 json 对象
        jsErrInfo[UTF8String(L"编码").c_str()] = UTF8String(EI.sCode).c_str();
        jsErrInfo[UTF8String(L"描述").c_str()] = UTF8String(EI.sDesc).c_str();
    }

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["emitUTF8"] = true;
    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

运行结果:生成的 json

三. 生成 json 字符串

Json::StreamWriterBuilder 有很多参数,如前面例子当中的
jswBuilder["emitUTF8"] = true; 就是直接输出 UTF-8 字符,这个参数的默认值是 false,UTF-8 字符会进行转义之后再输出。

以下表格是 Json::StreamWriterBuilder 的参数说明:

参数 说明
"indentation" 缩进字符串。默认为制表符 "\t"
如果为空字符串 "" 输出没有缩进和换行。
"emitUTF8" false:转义输出 UTF-8 字符 (默认),
true:直接输出 UTF-8 字符。
"precisionType" "significant":用科学计数法表示浮点数 (默认);
"decimal":用小数表示浮点数。
"precision" 整数值,表示浮点数的精度。
科学计数法:有效数字位数 (默认17),
小数:小数点后保留位数。
"useSpecialFloats" 浮点数 NAN、+INF、-INF 的输出。
false:输出 "null", "-1e+9999", "1e+9999" (默认)
true:输出 "NaN", "-Infinity", "Infinity"
"dropNullPlaceholders" 是否输出 NULL 值。
false:NULL 输出 "null" (默认);
true:不输出 NULL 值。
"commentStyle" "All":保留所有的注释 (默认);
"None":删除所有的注释
"enableYAMLCompatibility" 按照 YAML 兼容的格式输出冒号。
false:根据 "indentation" 参数 (默认);
true:冒号前面没有空格,后面有1个空格。

1. 控制 json 缩进 / 压缩格式的 json

Json::StreamWriterBuilder 的 "indentation" 参数控制输出的缩进及换行的格式,如果 "indentation" 为空字符串,生成的 json 没有换行和不必要的空格,如下面的例子:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data"] = 12345;
    J["error"][0][UTF8String(L"编码").c_str()] = UTF8String(L"101" ).c_str();
    J["error"][0][UTF8String(L"描述").c_str()] = UTF8String(L"故障1").c_str();
    J["error"][1][UTF8String(L"编码").c_str()] = UTF8String(L"102" ).c_str();
    J["error"][1][UTF8String(L"描述").c_str()] = UTF8String(L"故障2").c_str();

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["emitUTF8"] = true; // 直接输出 UTF-8 字符
    jswBuilder["indentation"] = ""; // 压缩格式,没有换行和不必要的空白字符
    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

生成压缩格式的 json 字符串

Json::StreamWriterBuilder 的 "indentation" 参数默认是一个制表符 "\t",如果改成两个空格,效果如下:

    jswBuilder["indentation"] = "  "; // 缩进为 2 个空格
缩进为2个空格的效果

2. 直接输出 UTF-8 字符 / 转义输出 UTF-8 字符

Json::StreamWriterBuilder 的 "emitUTF8" 参数控制是否直接输出 UTF-8 字符,默认为 false 转义输出。

转义输出 UTF-8 字符的效果:英文字符和数字直接输出,汉字都变成了 "\u7384\u5774" 这样的格式了。

这是转义输出 UTF-8 字符的运行结果

3. 浮点数的输出类型和精度

浮点数输出类型 "precisionType" 有两种选择,科学计数法和小数。

例子:"precisionType" 为 "significant" 科学计数法,"precision" 精度为 6 位有效数字的运行效果。

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data01"] = 12345678.9;
    J["data02"] = 1234567.89;
    J["data03"] = 123456.789;
    J["data04"] = 12345.6789;
    J["data05"] = 1234.56789;
    J["data06"] = 123.456789;
    J["data07"] = 12.3456789;
    J["data08"] = 1.23456789;
    J["data09"] = 0.123456789;
    J["data10"] = 0.0123456789;
    J["data11"] = 0.00123456789;
    J["data12"] = 0.000123456789;
    J["data13"] = 0.0000123456789;
    J["data14"] = 0.00000123456789;

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["indentation"  ] = "  "; // 缩进为 2 个空格
    jswBuilder["emitUTF8"     ] = true; // 直接输出 UTF-8 字符
    jswBuilder["precisionType"] = "significant"; // 用科学计数法表示浮点数
    jswBuilder["precision"    ] = 6;             // 6 位有效数字

    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

科学计数法6位精度的运行结果

例子:"precisionType" 为 "decimal" 小数,"precision" 为小数点后面保留 3 位的运行效果。

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data01"] = 12345678.9;
    J["data02"] = 1234567.89;
    J["data03"] = 123456.789;
    J["data04"] = 12345.6789;
    J["data05"] = 1234.56789;
    J["data06"] = 123.456789;
    J["data07"] = 12.3456789;
    J["data08"] = 1.23456789;
    J["data09"] = 0.123456789;
    J["data10"] = 0.0123456789;
    J["data11"] = 0.00123456789;
    J["data12"] = 0.000123456789;
    J["data13"] = 0.0000123456789;
    J["data14"] = 0.00000123456789;

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["indentation"  ] = "  "; // 缩进为 2 个空格
    jswBuilder["emitUTF8"     ] = true; // 直接输出 UTF-8 字符
    jswBuilder["precisionType"] = "decimal"; // 用小数表示浮点数
    jswBuilder["precision"    ] = 3;         // 小数点后面保留 3 位

    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

小数点后面保留3位的运行结果

4. 浮点数 NAN, +INF, -INF 的输出方式

"useSpecialFloats" 是否输出浮点数的 NAN, +INF, -INF 值。

如果要使用 C++ Builder 的 Math::NaN、Math::Infinity、Math::NegInfinity 等数值,需要包含头文件:
#include

例子:"useSpecialFloats" 为 true,浮点数 NAN, +INF, -INF 值输出 "NaN", "Infinity", "-Infinity"

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data01"] = 12345678.9;
    J["data02"] = 1234567.89;
    J["data03"] = 123456.789;
    J["data04"] = 12345.6789;
    J["data05"] = 1234.56789;
    J["data06"] = 123.456789;
    J["data07"] = 12.3456789;
    J["data08"] = 1.23456789;
    J["data09"] = 0.123456789;
    J["data10"] = 0.0123456789;
    J["data11"] = 0.00123456789;
    J["data12"] = 0.000123456789;
    J["data13"] = 0.0000123456789;
    J["data14"] = 0.00000123456789;
    J["data15"] = (double)Math::NaN;
    J["data16"] = (double)Math::Infinity;
    J["data17"] = (double)Math::NegInfinity;

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["indentation"     ] = "  "; // 缩进为 2 个空格
    jswBuilder["emitUTF8"        ] = true; // 直接输出 UTF-8 字符
    jswBuilder["precisionType"   ] = "significant"; // 用科学计数法表示浮点数
    jswBuilder["precision"       ] = 6;             // 6 位有效数字
    jswBuilder["useSpecialFloats"] = true; // 输出 "NaN", "-Infinity", "Infinity"

    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

输出浮点数的特殊值

例子:"useSpecialFloats" 参数为 false,浮点数的 NAN, +INF, -INF 值分别输出为 "null", "1e+9999", "-1e+9999"。

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data01"] = 12345678.9;
    J["data02"] = 1234567.89;
    J["data03"] = 123456.789;
    J["data04"] = 12345.6789;
    J["data05"] = 1234.56789;
    J["data06"] = 123.456789;
    J["data07"] = 12.3456789;
    J["data08"] = 1.23456789;
    J["data09"] = 0.123456789;
    J["data10"] = 0.0123456789;
    J["data11"] = 0.00123456789;
    J["data12"] = 0.000123456789;
    J["data13"] = 0.0000123456789;
    J["data14"] = 0.00000123456789;
    J["data15"] = (double)Math::NaN;
    J["data16"] = (double)Math::Infinity;
    J["data17"] = (double)Math::NegInfinity;

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["indentation"     ] = "  "; // 缩进为 2 个空格
    jswBuilder["emitUTF8"        ] = true; // 直接输出 UTF-8 字符
    jswBuilder["precisionType"   ] = "significant"; // 用科学计数法表示浮点数
    jswBuilder["precision"       ] = 6;             // 6 位有效数字
    jswBuilder["useSpecialFloats"] = false; // NAN, +INF, -INF 值分别输出为 "null", "1e+9999", "-1e+9999"

    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

不输出浮点数的特殊值

5. 是否输出 NULL 值

默认情况,是输出 NULL 值的。参数 "dropNullPlaceholders" 如果为 true,不输出 NULL 值。

例子:产生 2 个 NULL 值的输出,正常输出 NULL 值。

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data01"] = 12345678.9;
    J["data02"] = 1234567.89;
    J["data15"] = (double)Math::NaN;
    J["data16"] = (double)Math::Infinity;
    J["data17"] = (double)Math::NegInfinity;
    J["data18"] = Json::nullValue;

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["indentation"     ] = "  "; // 缩进为 2 个空格
    jswBuilder["emitUTF8"        ] = true; // 直接输出 UTF-8 字符
    jswBuilder["precisionType"   ] = "significant"; // 用科学计数法表示浮点数
    jswBuilder["precision"       ] = 6;             // 6 位有效数字
    jswBuilder["useSpecialFloats"] = false; // NAN, +INF, -INF 值分别输出为 "null", "1e+9999", "-1e+9999"

    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

正常输出 NULL 值

例子:设置参数 "dropNullPlaceholders" 为 true,不输出 NULL 值。

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Json::Value J; // 要生成的 json 对象

    J["data01"] = 12345678.9;
    J["data02"] = 1234567.89;
    J["data15"] = (double)Math::NaN;
    J["data16"] = (double)Math::Infinity;
    J["data17"] = (double)Math::NegInfinity;
    J["data18"] = Json::nullValue;

    // 把 J 的内容显示在 Memo1 里面

    Json::StreamWriterBuilder jswBuilder;
    jswBuilder["indentation"     ] = "  "; // 缩进为 2 个空格
    jswBuilder["emitUTF8"        ] = true; // 直接输出 UTF-8 字符
    jswBuilder["precisionType"   ] = "significant"; // 用科学计数法表示浮点数
    jswBuilder["precision"       ] = 6;             // 6 位有效数字
    jswBuilder["useSpecialFloats"] = false; // NAN, +INF, -INF 值分别输出为 "null", "1e+9999", "-1e+9999"
    jswBuilder["dropNullPlaceholders"] = true; // 不输出 NULL 值

    std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

    std::ostringstream os;
    jsWriter->write(J, &os);
    UTF8String txt = os.str().c_str();

    Memo1->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
    Memo1->Lines->Text = txt;
    Memo1->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
}

运行结果:

不输出 NULL 值

运行结果里面看到 data15 输出了 NULL 值,data18 没输出 NULL 值,分析原因:

  • data18 是真正的 NULL 值,没有输出;
  • data15 不是真正的 NULL 值,而是 NAN 值,程序设置了 NAN 值输出 NULL,就输出了 NULL 值。

6. 是否输出注释

参数 "commentStyle" 如果为 "None" 不输出注释。
默认 "commentStyle" 为 "All" 保留所有的注释。

例子:从 Memo1 里面读取 json 解析之后,输出到 Memo2 里面,正常输出:

void __fastcall TForm1::Button4Click(TObject *Sender)
{
   try
    {
        UTF8String txt = Memo1->Text;

        Json::Value jsValue;
        Json::String jsErrors;
        Json::CharReaderBuilder jcrBuilder;
        std::unique_ptrjcReader(jcrBuilder.newCharReader());

        if(!jcReader->parse(txt.c_str(), txt.c_str()+txt.Length(), &jsValue, &jsErrors))
        {
            Memo2->Lines->Add(L"JSON 解析错误");
            return;
        }

        // Memo1 里面的 json 已经解析到 jsValue 里面了
        // 把 jsValue 的内容显示在 Memo2 里面

        Json::StreamWriterBuilder jswBuilder;
        jswBuilder["emitUTF8"] = true; // 直接输出 UTF-8 字符
        jswBuilder["indentation"] = "  "; // 缩进 2 个空格
        std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

        std::ostringstream os;
        jsWriter->write(jsValue, &os);
        txt = os.str().c_str();

        Memo2->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
        Memo2->Lines->Text = txt;
        Memo2->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
    }
    catch(std::exception &e)
    {
        UTF8String sErrStr = e.what();
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
    catch(Exception &e)
    {
        UTF8String sErrStr = e.Message;
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
}

运行结果:

上面 Memo1 里面的 json 解析之后,输出到下面的 Memo2 里面

例子:参数 "commentStyle" 设为 "None",从 Memo1 里面读取 json 解析之后,输出到 Memo2 里面,不输出注释。

void __fastcall TForm1::Button4Click(TObject *Sender)
{
   try
    {
        UTF8String txt = Memo1->Text;

        Json::Value jsValue;
        Json::String jsErrors;
        Json::CharReaderBuilder jcrBuilder;
        std::unique_ptrjcReader(jcrBuilder.newCharReader());

        if(!jcReader->parse(txt.c_str(), txt.c_str()+txt.Length(), &jsValue, &jsErrors))
        {
            Memo2->Lines->Add(L"JSON 解析错误");
            return;
        }

        // Memo1 里面的 json 已经解析到 jsValue 里面了
        // 把 jsValue 的内容显示在 Memo2 里面

        Json::StreamWriterBuilder jswBuilder;
        jswBuilder["emitUTF8"] = true; // 直接输出 UTF-8 字符
        jswBuilder["indentation"] = "  "; // 缩进 2 个空格
        jswBuilder["commentStyle"] = "None";  // 删除所有的注释
        std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

        std::ostringstream os;
        jsWriter->write(jsValue, &os);
        txt = os.str().c_str();

        Memo2->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
        Memo2->Lines->Text = txt;
        Memo2->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
    }
    catch(std::exception &e)
    {
        UTF8String sErrStr = e.what();
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
    catch(Exception &e)
    {
        UTF8String sErrStr = e.Message;
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
}

运行结果:

运行结果:删除所有的注释

7. 控制冒号前后的空格,YAML 兼容格式

如果 "enableYAMLCompatibility" 为 true,使用 YAML 兼容格式输出,也就是冒号前面没有空格,冒号后面有 1 个空格。

例子:解析 Memo1 里面的 json,去掉注释,使用 YAML 兼容格式输出到 Memo2 里面。

void __fastcall TForm1::Button4Click(TObject *Sender)
{
   try
    {
        UTF8String txt = Memo1->Text;

        Json::Value jsValue;
        Json::String jsErrors;
        Json::CharReaderBuilder jcrBuilder;
        std::unique_ptrjcReader(jcrBuilder.newCharReader());

        if(!jcReader->parse(txt.c_str(), txt.c_str()+txt.Length(), &jsValue, &jsErrors))
        {
            Memo2->Lines->Add(L"JSON 解析错误");
            return;
        }

        // Memo1 里面的 json 已经解析到 jsValue 里面了
        // 把 jsValue 的内容显示在 Memo2 里面

        Json::StreamWriterBuilder jswBuilder;
        jswBuilder["emitUTF8"] = true; // 直接输出 UTF-8 字符
        jswBuilder["indentation"] = "  "; // 缩进 2 个空格
        jswBuilder["commentStyle"] = "None";  // 删除所有的注释
        jswBuilder["enableYAMLCompatibility"] = true; // YAML 兼容格式:冒号前面没有空格,后面有1个空格
        std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

        std::ostringstream os;
        jsWriter->write(jsValue, &os);
        txt = os.str().c_str();

        Memo2->Lines->LineBreak = L"\n"; // jsoncpp 的换行符是 "\n"
        Memo2->Lines->Text = txt;
        Memo2->Lines->LineBreak = L"\r\n"; // 恢复 Windows 的换行符 "\r\n"
    }
    catch(std::exception &e)
    {
        UTF8String sErrStr = e.what();
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
    catch(Exception &e)
    {
        UTF8String sErrStr = e.Message;
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
}

运行结果:

使用 YAML 兼容格式输出到 Memo2 里面

四. 保存 json文件

生成 json,保存在 L"d:\\test.txt" 里面。
使用 TStringList 存盘,采用 UTF-8 编码

void __fastcall TForm1::Button5Click(TObject *Sender)
{
    try
    {
        Json::Value J; // 要生成的 json 对象

        J["data"] = 12345;
        J["error"][0][UTF8String(L"编码").c_str()] = UTF8String(L"101" ).c_str();
        J["error"][0][UTF8String(L"描述").c_str()] = UTF8String(L"故障1").c_str();
        J["error"][1][UTF8String(L"编码").c_str()] = UTF8String(L"102" ).c_str();
        J["error"][1][UTF8String(L"描述").c_str()] = UTF8String(L"故障2").c_str();

        // 把 J 的内容显示在 Memo1 里面

        Json::StreamWriterBuilder jswBuilder;
        jswBuilder["emitUTF8"] = true;
        std::unique_ptrjsWriter(jswBuilder.newStreamWriter());

        std::ostringstream os;
        jsWriter->write(J, &os);
        UTF8String txt = os.str().c_str();

        std::unique_ptrsl(new TStringList);
        sl->Text = txt;
        sl->SaveToFile(L"d:\\test.txt", TEncoding::UTF8);
    }
    catch(std::exception &e)
    {
        UTF8String sErrStr = e.what();
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
    catch(Exception &e)
    {
        UTF8String sErrStr = e.Message;
        Memo2->Lines->Add(L"错误:" + sErrStr);
    }
}

用记事本打开 "d:\\test.txt" 查看内容:

用记事本查看 "d:\test.txt" 的内容

五. 下载本文例子

请点击:jsoncpp-master-1.9.3-src-cbuilder 下载 jsoncpp-master 1.9.3 源码、C++ Builder 项目文件,编译好了的库文件、例子程序等。


参考:

  • C++ Builder 编译 jsoncpp 库 (0.y.z 分支)
  • C++ Builder 编译 jsoncpp 库 (master 分支)
  • C++ Builder 解析和生成 json (使用 jsoncpp (0.y.z))
  • C++ Builder 解析 json,Json::CharReaderBuilder 的使用方法
  • C++ Builder 生成 json,Json::StreamWriterBuilder 参数详解
  • C++ Builder 遍历 json (使用 jsoncpp)

你可能感兴趣的:(C++ Builder 生成 json,Json::StreamWriterBuilder 参数详解)