【问题标题】:Correct usage of Poco C++ JSON for parsing data正确使用 Poco C++ JSON 解析数据
【发布时间】:2013-03-01 11:54:53
【问题描述】:

谁能指导我Poco C++ JSON 的工作原理?

之前我使用过JsonReader 和 JsonToken。 Poco C++ 库似乎没有对应的对象。

例如,我如何使用 json 解析器创建一个对象名称,该对象名称包含标签名称处的 JSON 值?

【问题讨论】:

    标签: c++ json poco-libraries


    【解决方案1】:

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

    // objects
    std::string json = "{ \"test\" : { \"property\" : \"value\" } }";
    Parser parser;
    Var result = parser.parse(json);
    Object::Ptr object = result.extract<Object::Ptr>();
    Var test = object->get("test");
    object = test.extract<Object::Ptr>();
    test = object->get("property");
    std::string value = test.convert<std::string>();
    
    // array of objects
    std::string json = "[ {\"test\" : 0}, { \"test1\" : [1, 2, 3], \"test2\" : 4 } ]";
    Parser parser;
    Var result = parser.parse(json);
    Array::Ptr arr = result.extract<Array::Ptr>();
    Object::Ptr object = arr->getObject(0);//
    assert (object->getValue<int>("test") == 0);
    object = arr->getObject(1);
    arr = object->getArray("test1");
    result = arr->get(0);
    assert (result == 1);
    

    更多详情请见this answer

    【讨论】:

    • 谢谢你的好例子!如果 JSON 字符串包含多个相似对象的数组怎么办?
    • 使用流代替字符串会提高内存使用率吗?
    • 查看this answer 了解字符串/流和即将发生的变化
    • 注意:对于 POCO 1.6,DefaultHandler 已被删除,see here
    • 准确来说,DefaultHandler 在 1.5.2 版本中被移除
    【解决方案2】:
    #include <iostream>
    #include <string>
    #include <Poco/JSON/JSON.h>
    #include <Poco/JSON/Parser.h>
    #include <Poco/Dynamic/Var.h>
    
    using namespace std;
    using namespace Poco::JSON;
    
    string GetValue(Object::Ptr aoJsonObject, const char *aszKey) {
        Poco::Dynamic::Var loVariable;
        string lsReturn;
        string lsKey(aszKey);
    
        // Get the member Variable
        //
        loVariable = aoJsonObject->get(lsKey);
    
        // Get the Value from the Variable
        //
        lsReturn = loVariable.convert<std::string>();
    
        return lsReturn;
    }
    
    int main(int argc, char *argv[]) {
        string lsJson;
        Parser loParser;
    
        lsJson = "{\"TransactionCode\":\"000000\",\"FileRecordSequenceNumber\":\"111111\",\"TcrSequenceNumber\":\"222222\",\"TransactionRouteIndicator\":\"ABCDE\",\"MerchantEstablishmentNumber\":\"00000000000\",\"MerchantName\":\"BBBBBBBBB\",\"MerchantCity\":\"CCCCCCCC\"}";
    
        cout << lsJson << endl;
    
        // Parse the JSON and get the Results
        //
        Poco::Dynamic::Var loParsedJson = loParser.parse(lsJson);
        Poco::Dynamic::Var loParsedJsonResult = loParser.result();
    
        // Get the JSON Object
        //
        Object::Ptr loJsonObject = loParsedJsonResult.extract<Object::Ptr>();
    
        // Get the values for the member variables
        //
        //
        cout << "TransactionCode             " << GetValue(loJsonObject, "TransactionCode")               << endl;
        cout << "FileRecordSequenceNumber    " << GetValue(loJsonObject, "FileRecordSequenceNumber")      << endl;
        cout << "TcrSequenceNumber           " << GetValue(loJsonObject, "TcrSequenceNumber")             << endl;
        cout << "TransactionRouteIndicator   " << GetValue(loJsonObject, "TransactionRouteIndicator")     << endl;
        cout << "MerchantEstablishmentNumber " << GetValue(loJsonObject, "MerchantEstablishmentNumber")   << endl;
        cout << "MerchantName                " << GetValue(loJsonObject, "MerchantName")                  << endl;
        cout << "MerchantCity                " << GetValue(loJsonObject, "MerchantCity")                  << endl;
    
        return 0;
    
    }
    
    Results:
    {"TransactionCode":"000000","FileRecordSequenceNumber":"111111","TcrSequenceNumber":"222222","TransactionRouteIndicator":"ABCDE","MerchantEstablishmentNumber":"00000000000","MerchantName":"BBBBBBBBB","MerchantCity":"CCCCCCCC"}
    TransactionCode             000000
    FileRecordSequenceNumber    111111
    TcrSequenceNumber           222222
    TransactionRouteIndicator   ABCDE
    MerchantEstablishmentNumber 00000000000
    MerchantName                BBBBBBBBB
    MerchantCity                CCCCCCCC
    

    【讨论】:

    • 与 Poco 1.6.0 一起开箱即用,非常好
    • +1 用于显示#includes 和 usings。我不明白为什么这么多 C++ 示例没有显示这些,这通常是弄清楚如何使用该东西最困难的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多