⌛⌛ 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 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ä. EsimerkiksiisString
palauttaatrue
-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 tiedon tyypiksiboolean
.
ArrayNode
-luokka, joka on tarkoitettuNode
-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ää 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
-olioita. 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 avaimenkey
arvoa 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.
Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml
seuraavat määritykset:
artifactId
-elementin arvo onjson
.version
-elementin arvo on1.0
.maven.compiler.source
jamaven.compiler.target
-elementtien arvo on17
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 onJsonTest
, 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.