The ubjson extension implements encode to and decode from the Universal Binary JSON Specification data format. You can either parse into or serialize from a variant-like structure, basic_json, or your own data structures using json_type_traits.
jsoncons data item | jsoncons tag | UBJSON data item |
---|---|---|
null | null | |
bool | true or false | |
int64 | uint8_t or integer | |
uint64 | uint8_t or integer | |
double | float 32 or float 64 | |
string | string | |
string | big_integer | high precision number type |
string | big_decimal | high precision number type |
byte_string | array of uint8_t | |
array | array | |
object | object |
#include <jsoncons/json.hpp>
#include <jsoncons_ext/ubjson/ubjson.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
using namespace jsoncons;
int main()
{
ojson j1 = ojson::parse(R"(
{
"application": "hiking",
"reputons": [
{
"rater": "HikingAsylum.example.com",
"assertion": "strong-hiker",
"rated": "Marilyn C",
"rating": 0.90
}
]
}
)");
// Encode a basic_json value to UBJSON
std::vector<uint8_t> data;
ubjson::encode_ubjson(j1, data);
// Decode UBJSON to a basic_json value
ojson j2 = ubjson::decode_ubjson<ojson>(data);
std::cout << "(1)\n" << pretty_print(j2) << "\n\n";
// Accessing the data items
const ojson& reputons = j2["reputons"];
std::cout << "(2)\n";
for (auto element : reputons.array_range())
{
std::cout << element.at("rated").as<std::string>() << ", ";
std::cout << element.at("rating").as<double>() << "\n";
}
std::cout << std::endl;
// Get a UBJSON value for a nested data item with jsonpointer
std::error_code ec;
const auto& rated = jsonpointer::get(j2, "/reputons/0/rated", ec);
if (!ec)
{
std::cout << "(3) " << rated.as_string() << "\n";
}
std::cout << std::endl;
}
Output:
(1)
{
"application": "hiking",
"reputons": [
{
"rater": "HikingAsylum.example.com",
"assertion": "strong-hiker",
"rated": "Marilyn C",
"rating": 0.9
}
]
}
(2)
Marilyn C, 0.9
(3) Marilyn C
#include <jsoncons/json.hpp>
#include <jsoncons_ext/ubjson/ubjson.hpp>
namespace ns {
struct reputon
{
std::string rater;
std::string assertion;
std::string rated;
double rating;
friend bool operator==(const reputon& lhs, const reputon& rhs)
{
return lhs.rater == rhs.rater && lhs.assertion == rhs.assertion &&
lhs.rated == rhs.rated && lhs.rating == rhs.rating;
}
friend bool operator!=(const reputon& lhs, const reputon& rhs)
{
return !(lhs == rhs);
};
};
class reputation_object
{
std::string application;
std::vector<reputon> reputons;
// Make json_type_traits specializations friends to give accesses to private members
JSONCONS_TYPE_TRAITS_FRIEND;
public:
reputation_object()
{
}
reputation_object(const std::string& application, const std::vector<reputon>& reputons)
: application(application), reputons(reputons)
{}
friend bool operator==(const reputation_object& lhs, const reputation_object& rhs)
{
return (lhs.application == rhs.application) && (lhs.reputons == rhs.reputons);
}
friend bool operator!=(const reputation_object& lhs, const reputation_object& rhs)
{
return !(lhs == rhs);
};
};
} // ns
// Declare the traits. Specify which data members need to be serialized.
JSONCONS_MEMBER_TRAITS_DECL(ns::reputon, rater, assertion, rated, rating);
JSONCONS_MEMBER_TRAITS_DECL(ns::reputation_object, application, reputons);
int main()
{
ns::reputation_object val("hiking", { ns::reputon{"HikingAsylum.example.com","strong-hiker","Marilyn C",0.90} });
// Encode a ns::reputation_object value to UBJSON
std::vector<uint8_t> data;
ubjson::encode_ubjson(val, data);
// Decode UBJSON to a ns::reputation_object value
ns::reputation_object val2 = ubjson::decode_ubjson<ns::reputation_object>(data);
assert(val2 == val);
}