- COMP.CS.140
- 7. Pakkaukset
- 7.3 ⌛⌛ JSON
⌛⌛ 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 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 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 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.
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.