Directorio de artículos
- prefacio
- 1. Análisis Json de la biblioteca C
- 2. Análisis de C++ libjsoncpp.a
-
- 2-1 Descargar y compilar
- 2-2 Use Json::FastWriter para encapsular paquetes JSON (no recomendado)
- 2-3 Use Json::Reader para analizar paquetes JSON (no recomendado)
- 2-4 Use Json::StreamWriterBuilder para sellar paquetes JSON
- 2.5 Usar Json::CharReaderBuilder y Json::CharReader para analizar cadenas json
prefacio
1. Análisis Json de la biblioteca C
2. Análisis de C++ libjsoncpp.a
2-1 Descargar y compilar
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
Use la compilación de secuencias de comandos (elimine los pasos 3 y 4 para escribir una secuencia de comandos) y asígnele el nombre 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
Ejecución sh build.sh a
significa compilar como una biblioteca estática, sh build.sh so
significa compilar una biblioteca dinámica
2-2 Use Json::FastWriter para encapsular paquetes JSON (no recomendado)
No se recomienda este método, porque se informará el siguiente mensaje de advertencia:
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
Ejemplo:
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 }
compilaraarch64-himix100-linux-g++ json.cpp -L../ -ljsoncpp -I../include
2-3 Use Json::Reader para analizar paquetes JSON (no recomendado)
No se recomienda este método, porque se informará el siguiente mensaje de advertencia:
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 Use Json::StreamWriterBuilder para sellar paquetes JSON
Ejemplo:
//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;
}
producción:
{
"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 Usar Json::CharReaderBuilder y Json::CharReader para analizar cadenas 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);
}
}