- COMP.CS.140
- 6. Class Hierarchies
- 6.8 ⌛⌛⌛ JSON
⌛⌛⌛ JSON¶
Place your code into files named Node.java (a template is provided for it), ArrayNode.java,
ObjectNode.java and ValueNode.java in the directory Round6/json. Remember to pull
student_template_project
for material.
In this task you will implement a simple class hierarchy for creating JSON data. If you are not yet familiar with JSON, it is high time to learn about it e.g. from Wikipedia.
JSON data consists of following types of data items:
Numbero. In this task type
double
.Truth value. In this task type
boolean
.String. In this task type
String
.Null. In this task the
null
reference.Array. An ordered list that may contain zero or more JSON data items.
Object. A dictionary type structure that may contain zero or more key-item pairs. The keys are strings.
The readily provided Node.java
contains an abstract class Node
that acts as the common
sypertype of JSON data items. You need to implement classes ValueNode
, ArrayNode
and
ObjectNode
that inherit Node
and are otherwise as follows:
ValueNode
stores a number, truth value, string ornull
. Public members:Constructors
ValueNode(double value)
,ValueNode(boolean value)
andValueNode(String value)
.Initialize the object to store the value of one of the accepted types. Note that the last constructor allows also to store
null
(which could not be specified as a primitive value).
Member functions
isNumber()
,isBoolean()
,isString()
andisNull()
that return truth values telling whether the stored value is of the corresponding type. E.g.isString
returnstrue
if and only if the stored value is a string.Member functions
double getNumber()
,boolean getBoolean()
andString getString()
that return the value (which is assumed to be of the corresponding type). E.g.getNumber
returns a stored number as adouble
, and it is the responsibility of the caller to first callisNumber
to check that the value really can be returned as a number.
ArrayNode
stores zero or moreNode
objects. Properties and public members:Implements the interface
Iterable<Node>
.A default constructor that initializes an empty array (no
Node
objects yet).Member function
void add(Node node)
that addsNode
to the end of the array.Member function
int size()
that returns the number of storedNode
objects.
ObjectNode
that stores zero or more key-value pairs where keys are strings and values areNode
objects. Properties and public members:Implements the interface
Iterable<String>
.Iterates over the keys of the stored key-value pairs in natural sorted order of
String
.
A default constructor that initializes an empty JSON object (has no key-value pairs yet).
Member function
Node get(String key)
that returns theNode
object corresponding tokey
(ornull
if it does not exits).Member function
void set(String key, Node node)
that adds a key-value pair described bythe parameters. A possible earlier value for the key will be overwritten.
Member function
int size()
that returns the number of storedNode
objects.
The implementations of ArrayNode
and ObjectNode
can be extremely simple if you use Java
containers in a wise manner.
The class Node
contains a function printSimple
that prints a crude description of the JSON
data represented by the Node
object it receives as a parameter. The class also contains a
function printJson
that does not have a proper implementation. You may receive up to 30 points
if you implement printJson
in such manner that it prints out a “nice” JSON data representation.
If you skip this part, you may receive up to 20 points. See the example outputs for details about
what kind of output printJson
should produce.
The class Node
also already provides functions isValue
, isArray
and isObject
for
inspecting the Node
type.
Testing¶
You may test your implementation by using the test program given in the file JsonTest.java
and
the example output given in the files output1.txt
, output2.txt
, output3.txt
,
output4.txt
, output5.txt
and output6.txt
. Place these files to the same
directory with your code, compile the test program e.g. as javac *.java
, and run the tests as
java JsonTest 1 simple
, java JsonTest 2 simple
, java JsonTest 3 simple
,
java JsonTest 4 simple
, java JsonTest 3 json
and java JsonTest 4 json
. The expected
outputs of these six tests are given in the files output1.txt
, output2.txt
,
output3.txt
, output4.txt
, output5.txt
and output6.txt
. The first four tests use
printSimple
and the last two tests use printJson
. If you implement printJson
, see the
last two example output files for details about the expected output format. Below is also an
example of how printJson
would print the JSON data of the second test:
{
"address": {
"city": "Tampere",
"country": "Finland"
},
"faculties": [
{
"name": "Faculty of Built Environment"
},
{
"name": "Faculty of Education and Culture"
},
{
"name": "Faculty of Engineering and Natural Sciences"
},
{
"name": "Faculty of Information Technology and Communication Sciences"
},
{
"name": "Faculty of Management and Business"
},
{
"name": "Faculty of Medicine and Health Technology"
},
{
"name": "Faculty of Social Sciences"
}
],
"name": "Tampere University"
}
A+ presents the exercise submission form here.