文章目录
前言
1. C 库Json解析
2. C++ libjsoncpp.a解析
2-1. 下载和编译
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);
}
}