⌛⌛ 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ä.

Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml-tiedosto paikallisen tietovarastosi round7/json-hakemistoon ja tee tähän hakemistoon src/main/java-niminen alihakemisto. Tee luokkatiedostot ArrayNode.java, ObjectNode.java ja ValueNode.java ja liitä ne fi.tuni.prog3.json-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa round7/json/src/main/java/fi/tuni/prog3/json.

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 tiedon tyypiksi boolean.

  • ArrayNode-luokka, joka on tarkoitettu Node-olioiden säilömiseen. Ominaisuudet ja julkiset jäsenet:

    • Toteuttaa rajapinnan Iterable<Node>.

    • Oletusrakennin, joka alustaa tyhjän taulukon eli taulukon, joka ei 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-olioita. 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.

Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml seuraavat määritykset:

  • artifactId-elementin arvo on json.

  • version-elementin arvo on 1.0.

  • maven.compiler.source ja maven.compiler.target -elementtien arvo on 17 tai pienempi. Tarkistimella on asennettuna Java 17, joten tätä uudempaa versiota ei voi käyttää.

  • Onejar-liitännäisen määritys, jonka mainClass-elementin arvo on JsonTest, joka on alla kuvattu valmiina annettu testiluokka.

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 JsonTest.java Maven-projektisi alihakemiston src/main/java juureen ja muut tiedostot Maven-projektisi juurihakemistoon pom.xml tiedoston seuraksi. Edellä on huomattava, että JsonTest.java ei sisällä pakkausmääritystä, joten sitä ei siksi aseteta syvempään alihakemistoon.

Voit tämän jälkeen kääntää ohjelman komennolla mvn package ja suorittaa testit komennoilla java -jar target/json-1.0.one-jar.jar 1, java -jar target/json-1.0.one-jar.jar 2, java -jar target/json-1.0.one-jar.jar 3 ja java -jar target/json-1.0.one-jar.jar 4 projektin juurihakemistossa. 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.