⌛⌛ 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:

  • ValueNode luokka, joka sisältää numeroarvon, totuusarvon, merkkijonoarvon tai null-arvon. Luokan julkiset jäsenet ovat:

    • Rakentaja ValueNode(), joka asettaa olion tiedoksi null-arvon.

    • Rakentajat ValueNode(double value), ValueNode(boolean value) ja ValueNode(String value) asettavat olion tiedoksi jonkin edellä mainituista tyypeistä. Tehtävässä oletetaan, että ValueNode(String value)-rakentajalle ei anneta parametriksi null-arvoa.

    • Boolean-tyyppiset jäsenfunktiot isNumber(), isBoolean(), isString() ja isNull(), joista kukin tutkii onko olion tieto tiettyä tyyppiä. Esimerkiksi isString palauttaa true-arvon, jos ja vain jos olioon talletettu tieto on merkkijono.

    • Jäsenfunktiot double getNumber(), boolean getBoolean(), String getString() ja Object getNull(), joista kukin palauttaa olion sisältämän tiedon. Saantifunktion kutsujan vastuulla on varmistaa ennen kutsua oikea tietotyyppi tyypin tarkistavalla jäsenfunktiolla. Esimerkiksi getBoolean()-funktiota kutsuttaessa oletetaan, että aiemmin on todettu isBoolean()-funktiolla tiedontyypiksi boolean.

  • ArrayNode-luokka, joka Node-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ää annetun Node-olion taulukon loppuun.

    • Jäsenfunktio int size(), joka palauttaa taulukon Node-olioiden lukumäärän.

  • ObjectNode-luokka avain–alkio-parien säilömiseen. Parien avaimet ovat merkkijonoja ja alkiot Node-oliota. Ominaisuudet ja julkiset jäsenet:

    • Toteuttaa rajapinnan Iterable<String>. Iteroi kaikkien talletettujen avain–alkio-parien avaimet String-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 avaimen key arvoa vastaavan Node-olion. Paluuarvo on null-arvo sellaisenaan, jos avainta vastaavaa paria ei ole. Palauta siis null-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.