Se cere implementarea unei structuri de date (hashtable) care sa eficientizeze interogarea si manipularea obiectelor de tip JSON.
example.json
[
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"children": [ ],
"spouse": null
}
]
Tipurile de baza pentru obiectele JSON sunt:
JSON_ARRAY: vector cu 0 sau mai multe objects
JSON_OBJECT: colectie de perechi cheie:valoare unde cheia este de tip string (unica in cadrul object-ului) iar valoarea poate fi de orice tip
JSON_STRING: secventa de 0 sau mai multe caractere ASCII
JSON_BOOL: true sau false
JSON_NUMBER: intreg
JSON_NULL: valoare nula, reprezentata de cuvantul null
Operatiile pe care structura voastra de date trebuie sa le efectueze sunt:
get(succesiune_chei): afiseaza valoarea ultimei chei din succesiunea de chei
put(succesiune_chei, valoare): adauga/modifica perechea ultima_cheie:valoare
del(succesiune_chei): sterge perechea ultima_cheie:valoare
Operatiile pot esua cu urmatoarele mesaje de eroare, urmate de valoarea cheii la care au esuat:
ERROR_NOT_ARRAY: se cere un index de la o cheie care nu reprezinta un JSON_ARRAY
ERROR_NOT_OBJECT: se cere o cheie de la o cheie care nu reprezinta un JSON_OBJECT
ERROR_INDEX_OUT_OF_RANGE: se cere un index de la o cheie care reprezinta un JSON_ARRAY cu un numar mai mic de intrari decat index-ul cerut
KEY_NOT_FOUND: cheia cautata nu a fost gasita
Fiecare mesaj de eroare este precedat de numele operatiei la care a aparut eroarea.
Pentru a observa comportamentul operatiilor de mai sus, urmariti exemplul de input/output.
Exemplu input/output
Operatiile de mai jos sunt efectuate asupra JSON-ului din example.json
input
GET
GET 0
GET 0 "firstName"
GET 0 "age"
GET 0 "isAlive"
GET 0 "spouse"
GET 0 "notAKey"
GET 0 "address" "city"
GET 0 "address" "notAKey"
GET 0 "notAKey1" "notAKey2"
GET 0 "spouse" 0
GET 0 "phoneNumbers" 0
GET 0 "phoneNumbers" 0 "type"
GET 0 "children"
GET 0 "children" 0
PUT "aKey" "aValue"
PUT 0 "aKey" "aValue"
GET 0 "aKey"
PUT 0 "address" null
GET 0 "address" "city"
GET 0 "address"
PUT 0 "spouse" "Jessica"
GET 0 "spouse"
PUT 0 "phoneNumbers" 1 "type" "mobile"
GET 0 "phoneNumbers" 1 "type"
PUT 0 "children" 0 "name" "John Snow"
DEL 0 "firstName"
GET 0 "firstName"
DEL 0 "notAkey"
DEL 1 "firstName"
GET 0 "phoneNumbers" 0 "number"
DEL 0 "phoneNumbers" 0
GET 0 "phoneNumbers" 0 "number"
DEL 0 "spouse"
DEL 0 "address"
GET 0 "address" "city"
output
JSON_ARRAY
JSON_OBJECT
"John"
25
true
null
GET_KEY_NOT_FOUND "notAKey"
"New York"
GET_KEY_NOT_FOUND "notAKey"
GET_KEY_NOT_FOUND "notAKey1"
GET_ERROR_NOT_ARRAY "spouse"
JSON_OBJECT
"home"
JSON_ARRAY
GET_ERROR_INDEX_OUT_OF_RANGE "children"
PUT_ERROR_NOT_OBJECT root
"aValue"
GET_ERROR_NOT_OBJECT "address"
null
"Jessica"
"mobile"
PUT_ERROR_INDEX_OUT_OF_RANGE "children"
GET_KEY_NOT_FOUND "firstName"
DEL_INDEX_OUT_OF_RANGE root
"212 555-1234"
"646 555-4567"
GET_KEY_NOT_FOUND "address"
Precizari
Fisierele de test cu obiectele JSON sunt valide, nu este nevoie sa faceti verificari suplimentare.
Indicatii de implementare
Executabilul se va numi "jsonparser" si va primi exact 3 parametri: fisierul ce contine obiectul JSON, fisierul de input si fisierul de output.
Se poate folosi doar clasa string din STL.
Hashtable-ul se afla in atasament.