Converting between graphql::response::Value in GraphQLResponse.h
and JSON strings is done in an optional library target called graphqljson.
The included implementation uses RapidJSON
release 1.1.0, but if you don't need JSON support, or you want to integrate
a different JSON library, you can set GRAPHQL_USE_RAPIDJSON=OFF in your
CMake configuration.
If you want to use a different JSON library, you can add implementations of the functions in JSONResponse.h:
namespace graphql::response {
JSONRESPONSE_EXPORT std::string toJSON(Value&& response);
JSONRESPONSE_EXPORT Value parseJSON(const std::string& json);
} // namespace graphql::responseYou will also need to update the CMakeLists.txt file in the ../src directory to add your own implementation. See the comment in that file for more information:
# RapidJSON is the only option for JSON serialization used in this project, but if you want
# to use another JSON library you can implement an alternate version of the functions in
# JSONResponse.cpp to serialize to and from GraphQLResponse and build graphqljson from that.
# You will also need to define how to build the graphqljson library target with your
# implementation, and you should set BUILD_GRAPHQLJSON so that the test dependencies know
# about your version of graphqljson.
option(GRAPHQL_USE_RAPIDJSON "Use RapidJSON for JSON serialization." ON)You can plug-in a type-erased streaming response::Writer to serialize a response::Value
to some other output mechanism, without building a single string buffer for the entire
document in memory. For example, you might use this to write directly to a buffered IPC pipe
or network connection:
class [[nodiscard]] Writer final
{
private:
struct Concept
{
virtual ~Concept() = default;
virtual void start_object() const = 0;
virtual void add_member(const std::string& key) const = 0;
virtual void end_object() const = 0;
virtual void start_array() const = 0;
virtual void end_arrary() const = 0;
virtual void write_null() const = 0;
virtual void write_string(const std::string& value) const = 0;
virtual void write_bool(bool value) const = 0;
virtual void write_int(int value) const = 0;
virtual void write_float(double value) const = 0;
};
...
public:
template <class T>
Writer(std::unique_ptr<T> writer)
: _concept { std::static_pointer_cast<const Concept>(
std::make_shared<Model<T>>(std::move(writer))) }
{
}
GRAPHQLRESPONSE_EXPORT void write(Value value) const;
};Internally, this is what graphqljson uses to implement response::toJSON with RapidJSON.
It wraps a rapidjson::Writer in response::Writer and then writes into a
rapidjson::StringBuffer through that.