正确使用Poco C++ JSON解析数据

iezvtpos  于 2024-01-09  发布在  其他
关注(0)|答案(3)|浏览(299)

有人能告诉我Poco C++ JSON是怎么工作的吗?
之前我用过JsonReader和JsonToken,Poco C++库似乎没有对应的对象。
例如,我如何使用json解析器来创建一个由标记名称处的JSON值组成的对象名称?

flvtvl50

flvtvl501#

编辑:从1.5.2开始,通过将DefaultList设置为. default(并将其重命名为正确的名称-ParseHandler),事情得到了简化。因此,如果您所需要的只是解析,则无需再显式提供处理程序:

  1. // objects
  2. std::string json = "{ \"test\" : { \"property\" : \"value\" } }";
  3. Parser parser;
  4. Var result = parser.parse(json);
  5. Object::Ptr object = result.extract<Object::Ptr>();
  6. Var test = object->get("test");
  7. object = test.extract<Object::Ptr>();
  8. test = object->get("property");
  9. std::string value = test.convert<std::string>();
  10. // array of objects
  11. std::string json = "[ {\"test\" : 0}, { \"test1\" : [1, 2, 3], \"test2\" : 4 } ]";
  12. Parser parser;
  13. Var result = parser.parse(json);
  14. Array::Ptr arr = result.extract<Array::Ptr>();
  15. Object::Ptr object = arr->getObject(0);//
  16. assert (object->getValue<int>("test") == 0);
  17. object = arr->getObject(1);
  18. arr = object->getArray("test1");
  19. result = arr->get(0);
  20. assert (result == 1);

字符串
请参阅此答案了解更多详细信息。

展开查看全部
yrefmtwq

yrefmtwq2#

  1. #include <iostream>
  2. #include <string>
  3. #include <Poco/JSON/JSON.h>
  4. #include <Poco/JSON/Parser.h>
  5. #include <Poco/Dynamic/Var.h>
  6. using namespace std;
  7. using namespace Poco::JSON;
  8. string GetValue(Object::Ptr aoJsonObject, const char *aszKey) {
  9. Poco::Dynamic::Var loVariable;
  10. string lsReturn;
  11. string lsKey(aszKey);
  12. // Get the member Variable
  13. //
  14. loVariable = aoJsonObject->get(lsKey);
  15. // Get the Value from the Variable
  16. //
  17. lsReturn = loVariable.convert<std::string>();
  18. return lsReturn;
  19. }
  20. int main(int argc, char *argv[]) {
  21. string lsJson;
  22. Parser loParser;
  23. lsJson = "{\"TransactionCode\":\"000000\",\"FileRecordSequenceNumber\":\"111111\",\"TcrSequenceNumber\":\"222222\",\"TransactionRouteIndicator\":\"ABCDE\",\"MerchantEstablishmentNumber\":\"00000000000\",\"MerchantName\":\"BBBBBBBBB\",\"MerchantCity\":\"CCCCCCCC\"}";
  24. cout << lsJson << endl;
  25. // Parse the JSON and get the Results
  26. //
  27. Poco::Dynamic::Var loParsedJson = loParser.parse(lsJson);
  28. Poco::Dynamic::Var loParsedJsonResult = loParser.result();
  29. // Get the JSON Object
  30. //
  31. Object::Ptr loJsonObject = loParsedJsonResult.extract<Object::Ptr>();
  32. // Get the values for the member variables
  33. //
  34. //
  35. cout << "TransactionCode " << GetValue(loJsonObject, "TransactionCode") << endl;
  36. cout << "FileRecordSequenceNumber " << GetValue(loJsonObject, "FileRecordSequenceNumber") << endl;
  37. cout << "TcrSequenceNumber " << GetValue(loJsonObject, "TcrSequenceNumber") << endl;
  38. cout << "TransactionRouteIndicator " << GetValue(loJsonObject, "TransactionRouteIndicator") << endl;
  39. cout << "MerchantEstablishmentNumber " << GetValue(loJsonObject, "MerchantEstablishmentNumber") << endl;
  40. cout << "MerchantName " << GetValue(loJsonObject, "MerchantName") << endl;
  41. cout << "MerchantCity " << GetValue(loJsonObject, "MerchantCity") << endl;
  42. return 0;
  43. }
  44. Results:
  45. {"TransactionCode":"000000","FileRecordSequenceNumber":"111111","TcrSequenceNumber":"222222","TransactionRouteIndicator":"ABCDE","MerchantEstablishmentNumber":"00000000000","MerchantName":"BBBBBBBBB","MerchantCity":"CCCCCCCC"}
  46. TransactionCode 000000
  47. FileRecordSequenceNumber 111111
  48. TcrSequenceNumber 222222
  49. TransactionRouteIndicator ABCDE
  50. MerchantEstablishmentNumber 00000000000
  51. MerchantName BBBBBBBBB
  52. MerchantCity CCCCCCCC

字符串

展开查看全部
ndasle7k

ndasle7k3#

从Alex的片段(它索引到Json数组)中,我创建了一个工作示例,并在Json数组上添加了一个循环。

编译

  1. g++ -std=c++20 -o json-array-poco json-array-poco.cpp -lPocoRedis -lPocoUtil -lPocoNet -lPocoNetSSL -lPocoCrypto -lPocoXML -lPocoJSON -lPocoFoundation

字符串

需要

  1. sudo apt install libpoco-dev


存储到json-array-poco.cpp中

  1. #include <iostream>
  2. #include <Poco/JSON/JSON.h>
  3. #include <Poco/JSON/Parser.h>
  4. #include <stack>
  5. using Poco::JSON::Parser;
  6. using std::cout;
  7. using std::stack;
  8. using std::string;
  9. void example_index_into_array (){
  10. Parser parser;
  11. string json_string = R"( {"data":[{"p":11,"t":1111},{"p":22,"t":2222}],"foo":"bar"} )";
  12. auto json_pocojson = parser.parse(json_string).extract<Poco::JSON::Object::Ptr>(); // Specify type as Json
  13. auto foo_string = json_pocojson->get("foo").extract<string>(); // Specify type as string
  14. auto data_pjarray = json_pocojson->get("data").extract<Poco::JSON::Array::Ptr>(); // Specify type as Json array
  15. auto item_0 = data_pjarray->getObject(0);
  16. auto item_1 = data_pjarray->getObject(1);
  17. assert (foo_string == "bar");
  18. assert (item_0->getValue<int64_t>("t") == 1111);
  19. assert (item_1->getValue<int64_t>("t") == 2222);
  20. assert (item_0->getValue<int64_t>("p") == 11);
  21. assert (item_1->getValue<int64_t>("p") == 22);
  22. }
  23. void example_loop_over_array (){
  24. Parser parser;
  25. string json_string = R"( {"data":[{"p":11,"t":1111},{"p":22,"t":2222}],"foo":"bar"} )";
  26. auto json_pocojson = parser.parse(json_string).extract<Poco::JSON::Object::Ptr>(); // Specify type as Json
  27. auto data_pjarray = json_pocojson->get("data").extract<Poco::JSON::Array::Ptr>(); // Specify type as Json array
  28. stack<int> t;
  29. stack<int> p;
  30. t.push(2222);
  31. t.push(1111);
  32. p.push(22);
  33. p.push(11);
  34. // The Poco JSON array is not a C11 range, so a range-base for loop errors on compile with
  35. // this range-based 'for' statement requires a suitable "begin" function and none was foundC/C++(2291)
  36. // The pre-range method is the only option
  37. for (auto item_pjaiterator = data_pjarray->begin(); item_pjaiterator != data_pjarray->end(); ++item_pjaiterator) {
  38. auto item_pocojson = item_pjaiterator->extract<Poco::JSON::Object::Ptr>();
  39. assert (item_pocojson->get("t").extract<int64_t>() == t.top()); t.pop();
  40. assert (item_pocojson->get("p").extract<int64_t>() == p.top()); p.pop();
  41. }
  42. }
  43. int main() {
  44. cout << "This is json-array-poco\n";
  45. example_index_into_array();
  46. example_loop_over_array();
  47. return 0;
  48. }

展开查看全部

相关问题