Skip to content

Wrap RapidJSON to be used as objects of predefined classes

License

Notifications You must be signed in to change notification settings

viordash/RapidJSONWrapper

Repository files navigation

RapidJSONWrapper

CMake

Wrap RapidJSON to be used as objects of predefined class

Objects are represented as DTOs with json serialization/deserialization support:

class UserDto : public JsonObject {
  public:
	JsonValue<char *> Name;
	JsonCommonValue<uint32_t> Role;

	UserDto(char *name = {}, TUserRole role = {})
		: Name(this, "name", name), 
		  Role(this, "role", role){};
};

class GoodsDto : public JsonObject {
  public:
	JsonValue<int> Id;
	JsonValue<uint32_t> Created;
	JsonValue<char *> Group;
	JsonValue<char *> Name;
	JsonValue<float> Price;
	JsonValue<double> Quantity;
	JsonCommonValue<bool> Deleted;
	JsonCommonValue<char *> StoreName;

	GoodsDto(int id = {}, uint32_t created = {}, char *group = {}, char *name = {}, float price = {}, double quantity = {}, bool deleted = {}, char *storeName = {})
		: Id(this, "Id", id),					
		  Created(this, "Created", created),	
		  Group(this, "Group", group),			
		  Name(this, "Name", name),				
		  Price(this, "Price", price),			
		  Quantity(this, "Quantity", quantity), 
		  Deleted(this, "Deleted", deleted),	
		  StoreName(this, "StoreName", storeName){};
};
    
class GoodsList : public JsonObjectsArray {
public:
	bool Validate(JsonObject *item) override { return item->Validate(); }
	JsonObject *CreateItem() override { return new GoodsDto(); }
};

class OrderDto : public JsonObject {
  public:
	JsonValue<char *> Supplier;
	JsonCommonValue<uint32_t> DateTime;
	JsonValue<JsonArrayBase *> Goods;
	JsonValue<JsonObject *> User;
	GoodsList goodsList;
	UserDto userDto;

	OrderDto(char *supplier = {}, uint32_t dateTime = {}, char *userName = {}, TUserRole userRole = {})
		: Supplier(this, "supplier", supplier), 
		  DateTime(this, "dateTime", dateTime), 
		  Goods(this, "goods", &goodsList),		
		  userDto(userName, userRole),			
		  User(this, "user", &userDto){};
};

sample code (from tests):

TEST(JsonObjectTestsGroup, JsonObject_Complex_TryParse_Test) {
		OrderDto order;

		CHECK(order.TryStringParse("{\"supplier\":\"Dell\",\"dateTime\":1657058000,\"goods\":[{\"Id\":1,\"Created\":1657052789,\"Group\":\"Keyboards\",\"Name\":\"K1-100\",\"Price\":58."
							 "25,\"Quantity\":48.2,\"Deleted\":false,\"StoreName\":\"\"},{\"Id\":3,\"Created\":1657054789,\"Group\":\"Keyboards\",\"Name\":\"K3-100\",\"Price\":"
							 "258.25,\"Quantity\":548.2,\"Deleted\":false,\"StoreName\":\"\"},{\"Id\":4,\"Created\":1657055789,\"Group\":\"Keyboards\",\"Name\":\"K4-100\","
							 "\"Price\":358.25,\"Quantity\":648.2,\"Deleted\":false,\"StoreName\":\"\"}],\"user\":{\"name\":\"Joe Doe\",\"role\":1}}"));
		CHECK_EQUAL(order.goodsList.Size(), 3);
		CHECK_EQUAL(order.goodsList.Item<GoodsDto *>(0)->Created.Value, 1657052789);
		STRCMP_EQUAL(order.goodsList.Item<GoodsDto *>(2)->Name.Value, "K4-100");
		STRCMP_EQUAL(order.userDto.Name.Value, "Joe Doe");
	}
        
TEST(JsonObjectTestsGroup, JsonObject_Complex_WriteTo_Test) {
	OrderDto orderDto("Dell", 1657058000, "Joe Doe", TUserRole::uViewer);
	orderDto.goodsList.Add(new GoodsDto(1, 1657052789, "Keyboards", "K1-100", 58.25, 48.2));
	orderDto.goodsList.Add(new GoodsDto(2, 1657053789, "Keyboards", "K2-100", 158.25, 448.2));
	orderDto.goodsList.Add(new GoodsDto(3, 1657054789, "Keyboards", "K3-100", 258.25, 548.2));
	orderDto.goodsList.Add(new GoodsDto(4, 1657055789, "Keyboards", "K4-100", 358.25, 648.2));

	rapidjson::Document doc;
	doc.SetObject();

	orderDto.WriteToDoc(&doc);

	rapidjson::StringBuffer buffer;
	rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
	doc.Accept(writer);

	const char *jsonStr = buffer.GetString();
	STRCMP_EQUAL(jsonStr, "{\"supplier\":\"Dell\",\"dateTime\":1657058000,\"goods\":[{\"Id\":1,\"Created\":1657052789,\"Group\":\"Keyboards\",\"Name\":\"K1-100\",\"Price\":58."
						  "25,\"Quantity\":48.2,\"Deleted\":false,\"StoreName\":null},{\"Id\":2,\"Created\":1657053789,\"Group\":\"Keyboards\",\"Name\":\"K2-100\",\"Price\":158."
						  "25,\"Quantity\":448.2,\"Deleted\":false,\"StoreName\":null},{\"Id\":3,\"Created\":1657054789,\"Group\":\"Keyboards\",\"Name\":\"K3-100\",\"Price\":"
						  "258.25,\"Quantity\":548.2,\"Deleted\":false,\"StoreName\":null},{\"Id\":4,\"Created\":1657055789,\"Group\":\"Keyboards\",\"Name\":\"K4-100\","
						  "\"Price\":358.25,\"Quantity\":648.2,\"Deleted\":false,\"StoreName\":null}],\"user\":{\"name\":\"Joe Doe\",\"role\":1}}");
}

About

Wrap RapidJSON to be used as objects of predefined classes

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published