Webservices in C++: JSON-Daten (de)serialisieren mit Bibliothek PropertyTree
Die meisten Webanwendungen tauschen mit ihrem Backend Daten im JSON-Format aus. In C++-Code gelingt das mit der Boost-Bibliothek PropertyTree. Ein Leitfaden.
- Oliver Lau
Statt nur ein monströses "Hallo, Welt"-Programm zu sein, soll der mithilfe von Boost.Beast programmierte Webservice aus Teil 1 dieser kleinen Artikelserie etwas Sinnvolles tun: beliebig große Zahlen darauf prüfen, ob sie prim sind, und mit einer Aussage über die Primeigenschaft sowie gegebenenfalls den Primfaktoren antworten. Wie der Webservice die empfangenen Daten einliest und seine Ergebnisse für die Übertragung vorbereitet, zeigt dieser zweite Teil.
Zum Ăśbertragen strukturierter, zusammengesetzter Daten ist das JSON-Format (JavaScript Object Notation) eine gute Wahl. Daten in diesem Format bestehen aus menschenlesbaren, UTF-8-kodierten Zeichenfolgen. Zwar gibt es zum Datenaustausch zwischen Client und Server effizientere Formate, zum Beispiel Protobuf (Protocol Buffers) von Google, aber noch baut die Mehrheit der Webanwendungen auf das gute, alte JSON.
Wenn man eh schon mit dem Boost-Framework unterwegs ist, bietet es sich an, darin nach JSON-Unterstützung zu suchen. Und man findet sie auch, nämlich in der Bibliothek Boost.PropertyTree. In einem boost::property_tree::ptree
kann man beliebig tief verschachtelte Daten fast jeden Typs speichern, die auf jeder Ebene über Schlüssel referenziert werden können, genau so, wie man es von JSON kennt. Die Schlüssel müssen vom Typ std::string
oder std::wstring
sein, damit die zu ptree
gehörenden Serialisierer und Deserialisierer funktionieren. Ein Serialisierer erzeugt aus dem ptree
die Daten im gewünschten Format, zum Beispiel JSON; ein Deserialisierer (Parser) ist das Gegenstück dazu. Denkt man in Objekten, die naturgemäß dynamisch sind, also ihre Eigenschaften während der Programmlaufzeit ändern können, friert ein Serialisieren deren Zustand ein. Erst nach dem Auftauen (Deserialisieren) kann ein Programm sie wieder verwenden.