Cpp: JSON parser in Cpp that provide support Serialize/Deserialize feature, converting JSON objects to user-defined classes?

前端 未结 2 442
走了就别回头了
走了就别回头了 2021-01-27 02:32

I\'m working on native C++ development and looking for JSON parser that can handle complex JSON files and convert into class objects.

  1. I\'ve looked at native be

2条回答
  •  臣服心动
    2021-01-27 03:06

    Is there an equivalent in RapidJSON or other JSON parser that allow us to configure Serialize and Deserialize feature (ex: Jackson JAVA library is the highly customizable serialization and deserialization process, converting JSON objects to Java classes)?

    I think ThorsSerializer does the job.
    All you have to do is declare via ThorsAnvil_MakeTrait() what fields in a class are serializable (see below).

    If No, What's the right way to work around it? Is there only way to build your own serializer to convert to our custom classes?

    You can use RapidJSON (or several other libraries) but you need to write customer code to convert from the JSON objects generated by the library into your own objects. This is not terribly hard.

    The other disadvantage of most libraries is that they actually build a full representation of the data in JSON like objects and you need to copy the data into your structure. For small objects not a problem but for more complex structures this can take up some space. The ThorsSerializer avoids this completely and copies data directly into your structures: see look at memory used.

    Using the same example as @Daniel
    Using ThorsSerializer: https://github.com/Loki-Astari/ThorsSerializer
    Note: I am the author.

    #include 
    
    const std::string s = R"(
    [
        {
            "author" : "Haruki Murakami",
            "title" : "Kafka on the Shore",
            "price" : 25.17
        },
        {
            "author" : "Charles Bukowski",
            "title" : "Pulp",
            "price" : 22.48
        }
    ]
    )";
    
    namespace ns {
        struct book
        {   
            std::string author;
            std::string title;
            double price;
        };  
    } // namespace ns
    
    
    #include 
    #include "ThorSerialize/Traits.h"   // for ThorsAnvil_MakeTrait
    #include "ThorSerialize/SerUtil.h"  // Has definitions for all STL types.
    #include "ThorSerialize/JsonThor.h" // JSON version: There is also YAML
    
    
    ThorsAnvil_MakeTrait(ns::book, author, title, price);
    

    Then reading/writting json in main is simple:

    int main()
    {
         using ThorsAnvil::Serialize::jsonExport;
         using ThorsAnvil::Serialize::jsonImport;
    
    
         std::stringstream   stream(s);
    
         ns::book                   book;
         std::vector      allBooks;
         stream >> jsonImport(allBooks);
    
         std::cout << jsonExport(allBooks)
                   << "\n\n"
                   << jsonExport(allBooks, ThorsAnvil::Serialize::PrinterInterface::OutputType::Stream)
                   << "\n\n";
    }
    

    TO build:

    > g++ -std=c++14 main.cpp -lThorSerialize17
    

    Output:

    > ./a.out 
    [ 
        { 
            "author": "Haruki Murakami", 
            "title": "Kafka on the Shore", 
            "price": 25.17
        }, 
        { 
            "author": "Charles Bukowski", 
            "title": "Pulp", 
            "price": 22.48
        }]
    
    [{"author":"Haruki Murakami","title":"Kafka on the Shore","price":25.17},{"author":"Charles Bukowski","title":"Pulp","price":22.48}]
    

提交回复
热议问题