C++库libjsoncpp使用

前言


1. C 库Json解析

link

2. C++ libjsoncpp.a解析

2-1. 下载和编译

jsoncpp

ARM交叉编译:
1. tar xvzf jsoncpp-src-0.5.0.tar.gz
2. mkdir arm_jsoncpp;cp include arm_jsoncpp -r;cp src/lib_json/* arm_jsoncpp;cd arm_jsoncpp
3. 编译静态库: aarch64-himix100-linux-g++ -c *.cpp -I./include -fPIC; ar cr libjsoncpp.a *.o
4. 编译动态库: aarch64-himix100-linux-g++ -shared -fPIC *.cpp -I./include -o libjsoncpp.so

使用脚本编译(将3,4步拎出来编写个脚本),命名为build.sh:

#!/bin/sh

if [ "$1" == "a" ];then
    echo -e "\033[1;32m编译静态库.\033[0m"
    aarch64-himix100-linux-g++ -c *.cpp -I./include ;ar rcs libjsoncpp.a *.o;rm *.o


elif [ "$1" == "so" ];then
    echo -e "\033[1;32m编译动态库.\033[0m"
    aarch64-himix100-linux-g++ -shared -fPIC *.cpp -I./include -o libjsoncpp.so
else
    echo -e "默认编译静态库"
    aarch64-himix100-linux-g++ -c *.cpp -I./include ;ar rcs libjsoncpp.a *.o

fi

执行sh build.sh a表示编译为静态库,sh build.sh so表示编译动态库

2-2. 使用Json::FastWriter封JSON包(不推荐)

该方式不推荐,因为会报如下警告信息:

json.cpp: In function 'int main()':
json.cpp:8:19: warning: 'FastWriter' is deprecated: Use StreamWriterBuilder instead [-Wdeprecated-declarations]
  Json::FastWriter writer;
                   ^~~~~~
In file included from ../include/json/json.h:13:0,
                 from json.cpp:3:
../include/json/writer.h:168:70: note: declared here
class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter

示例:

1 #include <iostream>
  2 #include <string.h>
  3 #include <json/json.h>
  4
  5 int main()
  6 {
  7     Json::Value root, params, picdatainfo, picdata;
  8     Json::FastWriter writer;	
  9
10     root["jsonrpc"]="2.0";
11     root["method"] = "DeviceUpLoadInfo";
12     params["id"]="76BFCDDE4D2C";
13     params["ip"]="192.168.6.168";
14     params["time"]="2020-7-14 00:00:41";
15     params["rfidinfo"]="075583849888190308020911_e280110c20007781e8440985_000000000000000000000000";
16
17     picdata["picType"]="src";
18     picdata["picdata"]="src123";
19     picdatainfo.append(picdata);
20     picdata.clear();
21     picdata["picType"]="person";
22     picdata["picdata"]="person123";
23     picdatainfo.append(picdata);
24
25     params["picdatainfo"]= picdatainfo;
26     root["params"]=params;
27     std::string Json = writer.write(root);
28
29     std::cout << "Json:" << Json << std::endl;
30     return 0;
31 }

编译 aarch64-himix100-linux-g++ json.cpp -L../ -ljsoncpp -I../include

2-3.使用Json::Reader解析JSON包(不推荐)

该方式不推荐,因为会报如下警告信息:

pszJsonBuf为JSON包数据
 std::string strparam = pszJsonBuf;

 //TRACK_LOG(LOG_DEBUG, "json_parse_pro::parse param : %s", strparam.c_str());
	 if (strparam.empty())
	 {
		 return ret_json;
	 }

	 try
	 {
		 Json::Reader reader;
		 reader.parse(strparam, root);
	 }
	 catch (Json::Exception & e)
	 {
		 ret_json.clear();
		 std::cout << e.what() << std::endl;

		 return ret_json;
		
	 }

2-4.使用Json::StreamWriterBuilder封JSON包

示例:

//20200715 使用StreamWriter 替代FastWriter
#include <iostream>
#include <string.h>
#include <json/json.h>


int main()
{
    Json::Value root, params, picdatainfo, picdata;
//    Json::FastWriter writer;
    Json::StreamWriterBuilder writerBuilder;
   // std::ostringstream os; 关于文件可以使用该方式,在这里已经有string,


    root["jsonrpc"]="2.0";
    root["method"] = "DeviceUpLoadInfo";
    params["id"]="76BFCDDE4D2C";
    params["ip"]="192.168.6.168";
    params["time"]="2020-7-14 00:00:41";
    params["rfidinfo"]="075583849888190308020911_e280110c20007781e8440985_000000000000000000000000";
    
    picdata["picType"]="src";
    picdata["picdata"]="src123";
    picdatainfo.append(picdata);
    picdata.clear();
    picdata["picType"]="person";
    picdata["picdata"]="person123";
    picdatainfo.append(picdata);


    params["picdatainfo"]= picdatainfo;
    root["params"]=params;


    std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter()); //从字符串中输出到Json文件
 //   jsonWriter->write(root, &os);
   // std::string Json = os.str();
    const std::string Json = Json::writerString(writerBuilder, root);

    std::cout << "Json:" << Json << std::endl;
    return 0;
}

输出:

{
    "jsonrpc" : "2.0",
    "method" : "DeviceUpLoadInfo",
    "params" :
    {
        "id" : "76BFCDDE4D2C",
        "ip" : "192.168.6.168",
        "picdatainfo" :
        [
            {
                "picType" : "src",
                "picdata" : "src123"
            },
            {
                "picType" : "person",
                "picdata" : "person123"
            }
        ],
        "rfidinfo" : "075583849888190308020911_e280110c20007781e8440985_000000000000000000000000",
        "time" : "2020-7-14 00:00:41"
    }
}

2.5 使用Json::CharReaderBuilder 和 Json::CharReader 解析 json 字符串

#define _u8s(s) UTF8String(s).c_str()
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    try
    {
        UTF8String txt = Memo1->Text;

        Json::Value jsValue;
        Json::String jsErrors;
        Json::CharReaderBuilder jcrBuilder;
        std::unique_ptr<Json::CharReader>jcReader(jcrBuilder.newCharReader());

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

        UTF8String sVal;
        double lfVal;
        int iVal;

        sVal = jsValue["name"].asCString();
        Memo2->Lines->Add(sVal);

        sVal = jsValue["desc"].asCString();
        Memo2->Lines->Add(sVal);

        lfVal = jsValue["value"].asDouble();
        Memo2->Lines->Add(lfVal);

        for(int i=0; i<2; i++)
        {
            Json::Value &jsFault = jsValue[_u8s(L"故障")][i];
            iVal = jsFault[_u8s(L"编码")].asInt();
            Memo2->Lines->Add(iVal);

            sVal = jsFault[_u8s(L"描述")].asCString();
            Memo2->Lines->Add(sVal);
        }
    }
    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);
    }
}

猜你喜欢

转载自blog.csdn.net/nc_linux/article/details/124962433