⌛⌛ JSON¶
JSON on järjestelmäriippumaton tiedostomuoto tietojen tallentamiseen ja niiden siirtämiseen eri järjestelmien välillä. JSON:ista on kerrottu enemmän muun muassa Wikipediassa.
JSON-data koostuu seuraavanlaisista data-alkioista:
Numero. Tässä tehtävässä tyyppinä
double.Totuusarvo. Tässä tehtävässä tyyppinä
boolean.Merkkijono. Tässä tehtävässä tyyppinä
String.Null. Tässä tehtävässä arvona
null.Taulukko. Lista, jossa on nolla tai useampia data-alkioita.
Objekti. Sanakirjaa muistuttava kokoelma, jossa on nolla tai useampia avain–alkio-pareja. Avaimet ovat aina merkkijonoja.
Tässä tehtävässä aloitetaan JSON-tiedostomuotoon tutustuminen toteuttamalla JSON-alkioita
mallintava luokkahierarkia. Materiaalien etätietovarastossa on annettu valmiiksi toteutettuna
abstrakti Node-luokka (round7/json/Node.java), joka on tässä tehtävässä JSON-alkioiden
yliluokka. Luokka sisältää lisäksi valmiit isValue-, isArray- ja isObject-funktiot
alkion tyypin tutkimiseen ja printJson-funktion alkioiden tulostamiseen.
Tehtävänäsi on toteuttaa Node-luokalle konkreettiset aliluokat ValueNode, ArrayNode
ja ObjectNode alla kuvatulla tavalla. Muista periyttää kukin luokka Node`-luokasta
extends-avainsanaan käyttämällä.
Tallenna luokkasi paikallisen tietovarastosi round7/json-hakemistoon tiedostoissa
ArrayNode.java, ObjectNode.java ja ValueNode.java.
Tehtävässä ei tarvitse luoda Maven-projektia. Jos teet projektin, niin kopioi yllä mainitut
kolme tiedostoasi projektin hakemistosta paikalliseen tietovarastosi round7/json/-hakemistoon
ja tallenna tiedostot versionhallintaan ennen kuin pusket vastauksesi etävarastoosi.
Tee seuraavaa:
ValueNodeluokka, joka sisältää numeroarvon, totuusarvon, merkkijonoarvon tainull-arvon. Luokan julkiset jäsenet ovat:Rakentaja
ValueNode(), joka asettaa olion tiedoksinull-arvon.Rakentajat
ValueNode(double value),ValueNode(boolean value)jaValueNode(String value)asettavat olion tiedoksi jonkin edellä mainituista tyypeistä. Tehtävässä oletetaan, ettäValueNode(String value)-rakentajalle ei anneta parametriksinull-arvoa.Boolean-tyyppiset jäsenfunktiotisNumber(),isBoolean(),isString()jaisNull(), joista kukin tutkii onko olion tieto tiettyä tyyppiä. EsimerkiksiisStringpalauttaatrue-arvon, jos ja vain jos olioon talletettu tieto on merkkijono.Jäsenfunktiot
double getNumber(),boolean getBoolean(),String getString()jaObject getNull(), joista kukin palauttaa olion sisältämän tiedon. Saantifunktion kutsujan vastuulla on varmistaa ennen kutsua oikea tietotyyppi tyypin tarkistavalla jäsenfunktiolla. EsimerkiksigetBoolean()-funktiota kutsuttaessa oletetaan, että aiemmin on todettuisBoolean()-funktiolla tiedontyypiksiboolean.
ArrayNode-luokka, jokaNode-olioiden säilömiseen. Ominaisuudet ja julkiset jäsenet:Toteuttaa rajapinnan
Iterable<Node>.Oletusrakennin, joka alustaa tyhjän taulukon eli taulukon, joka vielä sisällä yhtään
Node-oliota.Jäsenfunktio
void add(Node node), joka lisää annetunNode-olion taulukon loppuun.Jäsenfunktio
int size(), joka palauttaa taulukonNode-olioiden lukumäärän.
ObjectNode-luokka avain–alkio-parien säilömiseen. Parien avaimet ovat merkkijonoja ja alkiotNode-oliota. Ominaisuudet ja julkiset jäsenet:Toteuttaa rajapinnan
Iterable<String>. Iteroi kaikkien talletettujen avain–alkio-parien avaimetString-merkkijonojen luonnollisessa järjestyksessä.Oletusrakennin, joka alustaa olion siten, että sillä ei ole vielä yhtään avain-alkioparia.
Jäsenfunktio
Node get(String key), joka palauttaa avaimenkeyarvoa vastaavanNode-olion. Paluuarvo onnull-arvo sellaisenaan, jos avainta vastaavaa paria ei ole. Palauta siisnull-arvo vain haun epäonnistumisen merkkinä.Null-arvon sisältäväValueNode-olio palautetaan, jos avain liittyy sellaiseen.Jäsenfunktio
void set(String key, Node node), joka lisää parametrien kuvaaman avain–alkio-parin. Mahdollinen vanha saman avaimen alkio korvautuu uudella.Jäsenfunktio
int size(), joka palauttaa avain–alkio-parien lukumäärän.
Luokkien ArrayNode ja ObjectNode toteutukset voivat olla yksinkertaisia, jos hyödynnät
Javan valmiita säiliöitä järkevästi.
Toteutuksen testaus¶
Voit testata luokkiasi tiedostossa JsonTest.java annetun valmiin testiohjelman ja
tiedostoissa output1.txt, output2.txt, output3.txt ja output4.txt annettujen
esimerkkitulosteiden avulla. Aseta nämä tiedostot sekä omat luokkatoteutuksesi samaan hakemistoon,
käännä ohjelma esimerkiksi komennolla javac *.java, ja suorita testit komennoilla java JsonTest 1,
java JsonTest 2, java JsonTest 3 ja java JsonTest 4. Näiden neljän testin pitäisi
tuottaa tiedostoissa output1.txt, output2.txt, output3.txt ja output4.txt
olevat tulosteet.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.