mirror of
https://github.com/rafagafe/tiny-json.git
synced 2024-11-17 11:35:30 +00:00
143 lines
4.6 KiB
C++
143 lines
4.6 KiB
C++
|
|
/*
|
|
|
|
<https://github.com/rafagafe/tiny-json>
|
|
|
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
|
SPDX-License-Identifier: MIT
|
|
Copyright (c) 2016-2018 Rafa Garcia <rafagarcia77@gmail.com>.
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
|
|
*/
|
|
|
|
/*
|
|
* In this example the JSON library is used to analyze an object that some
|
|
* properties are expected.
|
|
*/
|
|
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <list>
|
|
#include <string>
|
|
#include "../tiny-json.h"
|
|
|
|
class jsonParser : jsonPool_t
|
|
{
|
|
static json_t* alloc_fn( jsonPool_t* pool )
|
|
{
|
|
const auto list_pool = (jsonParser*)pool;
|
|
list_pool->_list.emplace_back();
|
|
return &list_pool->_list.back();
|
|
}
|
|
|
|
std::list<json_t> _list{};
|
|
std::string _str{};
|
|
json_t const* _root{};
|
|
|
|
public:
|
|
jsonParser() : jsonPool_t{ &alloc_fn, &alloc_fn } {}
|
|
jsonParser( const char* str )
|
|
: jsonPool_t{ &alloc_fn, &alloc_fn }
|
|
, _str{ str }
|
|
{
|
|
_root = json_createWithPool( _str.data(), this );
|
|
}
|
|
jsonParser( const jsonParser& ) = delete;
|
|
jsonParser( jsonParser&& ) = delete;
|
|
jsonParser& operator=( const jsonParser& ) = delete;
|
|
jsonParser& operator=( jsonParser&& ) = delete;
|
|
|
|
void parse( const char* str )
|
|
{
|
|
_str = str;
|
|
_list.clear();
|
|
_root = json_createWithPool( _str.data(), this );
|
|
}
|
|
|
|
json_t const* root() const { return _root; }
|
|
};
|
|
|
|
|
|
/* Parse a json string. */
|
|
int main() {
|
|
const char* str = "{\n"
|
|
"\t\"firstName\": \"Bidhan\",\n"
|
|
"\t\"lastName\": \"Chatterjee\",\n"
|
|
"\t\"age\": 40,\n"
|
|
"\t\"address\": {\n"
|
|
"\t\t\"streetAddress\": \"144 J B Hazra Road\",\n"
|
|
"\t\t\"city\": \"Burdwan\",\n"
|
|
"\t\t\"state\": \"Paschimbanga\",\n"
|
|
"\t\t\"postalCode\": \"713102\"\n"
|
|
"\t},\n"
|
|
"\t\"phoneList\": [\n"
|
|
"\t\t{ \"type\": \"personal\", \"number\": \"09832209761\" },\n"
|
|
"\t\t{ \"type\": \"fax\", \"number\": \"91-342-2567692\" }\n"
|
|
"\t]\n"
|
|
"}\n";
|
|
puts( str );
|
|
jsonParser parser { str };
|
|
json_t const *json = parser.root();
|
|
if ( !json ) {
|
|
puts("Error json create.");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
json_t const* firstName = json_getProperty( json, "firstName" );
|
|
if ( !firstName || JSON_TEXT != json_getType( firstName ) ) {
|
|
puts("Error, the first name property is not found.");
|
|
return EXIT_FAILURE;
|
|
}
|
|
char const* firstNameVal = json_getValue( firstName );
|
|
printf( "Fist Name: %s.\n", firstNameVal );
|
|
|
|
char const* lastName = json_getPropertyValue( json, "lastName" );
|
|
if ( !lastName ) {
|
|
puts("Error, the last name property is not found.");
|
|
return EXIT_FAILURE;
|
|
}
|
|
printf( "Last Name: %s.\n", lastName );
|
|
|
|
json_t const* age = json_getProperty( json, "age" );
|
|
if ( !age || JSON_INTEGER != json_getType( age ) ) {
|
|
puts("Error, the age property is not found.");
|
|
return EXIT_FAILURE;
|
|
}
|
|
int const ageVal = (int)json_getInteger( age );
|
|
printf( "Age: %d.\n", ageVal );
|
|
|
|
json_t const* phoneList = json_getProperty( json, "phoneList" );
|
|
if ( !phoneList || JSON_ARRAY != json_getType( phoneList ) ) {
|
|
puts("Error, the phone list property is not found.");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
json_t const* phone;
|
|
for( phone = json_getChild( phoneList ); phone != 0; phone = json_getSibling( phone ) ) {
|
|
if ( JSON_OBJ == json_getType( phone ) ) {
|
|
char const* phoneNumber = json_getPropertyValue( phone, "number" );
|
|
if ( phoneNumber ) printf( "Number: %s.\n", phoneNumber );
|
|
}
|
|
}
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|