Subato

Resource Files

Json

Studieren Sie den zur Aufgabe gehörenden Lehrbrief und lösen Sie die Aufgaben darin. Testen Sie ihre Lösungen zunächst am besten interaktiv in der JShell.

Für die letzte Aufgabe brauchen Sie eine laufende Datenbank der Dokumentendatenbank mongodb. Auf den Subato Tests wird ein kurzer Test mit einer für die Tests lokalen Datenbank vorgenommen.


package name.panitz.json; import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; import java.io.*; import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.bson.Document; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.Filters; public interface Json{ static String ex1 = """ { "vorname": "Eva" , "name": "Luator" , "gebJahr": 1962 } """; static String xs = """ { "head": 1 , "tail": { "head": 2 , "tail": { "head": 3 , "tail": { "head": 4 , "tail": null } } } } """; static String windsor = """ { "name": "George" , "children": [{ "name": "Elizabeth" , "children": [{ "name": "Charles" , "children": [{ "name": "William" , "children": [{"name":"George"},{"name":"Charlotte"},{"name":"Louise"}]} ,{ "name": "Henry","children": [{ "name": "Archie"}]} ]} ,{ "name": "Anne" , "children" : [{ "name": "Peter" , "children": [{ "name": "Savannah"},{ "name": "Isla"}]} ,{ "name": "Zara","children":[{ "name": "Mia"},{ "name": "Lena"}]} ]} ,{ "name": "Andrew" , "children": [{"name":"Beatrice"},{"name": "Eugenie"}]} ,{ "name": "Edward" , "children": [{"name":"Louise"},{ "name": "James"}]}]} ,{ "name": "Magaret" , "children": [{ "name": "David" , "children": [{ "name": "Charles"},{ "name": "Margarita"}]} ,{ "name": "Sarah" , "children": [{ "name": "Samuel"},{ "name": "Arthur"}]} ]} ]} """; public static record JsonLong(long n) implements Json{} public static record JsonDouble(double n) implements Json{} public static record JsonBoolean(boolean b) implements Json{} public static record JsonString(String s) implements Json{} public static record JsonObject(Map<String,Json> map) implements Json{} public static record JsonArray(List<Json> elements) implements Json{} public static JsonObject parse(Reader in) throws Exception{ var codePointCharStream = CharStreams.fromReader(in); var lexer = new JsonGrammarLexer(codePointCharStream); var parser = new JsonGrammarParser(new CommonTokenStream(lexer)); var tree = parser.obj(); ParseTreeWalker.DEFAULT.walk(new JsonTreeBuilder(), tree); return tree.result; } default void forEach(Consumer<JsonObject> consume){ } default Set<String> collectNames(){ var result = new HashSet<String>(); collectNames(result); return result; } default void collectNames(Set<String> result){ /* ToDo */ } default void write(Writer out) throws Exception{ write("\n",out); } default void write(String indent, Writer out) throws Exception{ if (this instanceof JsonString s) out.write("\""+s.s+"\""); /* ToDo missing Json record instances. */ else throw new RuntimeException("Missing pattern: "+this.getClass()); } default String show() { try{ var out = new StringWriter(); write(out); return out.toString(); }catch(Exception e){ return "";} } static record Person(String name,String vorname,int gebJahr){ Json toJson(){ var map = new HashMap<String,Json>(); /* ToDo: Fill map with correct data. */ return new JsonObject(map); } } default Person getPerson(){ if (this instanceof JsonObject o){ /* ToDo build the person object and return it. */ } throw new RuntimeException("json not a Person: "+this.toString()); } default Document toBSON(){ if (this instanceof JsonObject o){ return (Document)toBSON2(); } return null; } default Object toBSON2(){ if (this instanceof JsonObject o){ return null; /*ToDo*/ } else if (this instanceof JsonDouble d) return d.n; return null; } static Json toJson(Document bson){ try{ return null;/*ToDo*/ }catch(Exception e){ throw new RuntimeException(e); } } default void saveToCollection(String dbname,String collectionName){ var mongoClient = MongoClients.create(); var database = mongoClient.getDatabase(dbname); var collection = database.getCollection(collectionName); collection.insertOne(toBSON()); } static MongoCollection<Document> getCollection(String dbname,String collectionName){ var mongoClient = MongoClients.create(); var database = mongoClient.getDatabase(dbname); return database.getCollection(collectionName); } static Set<String> getNames(String dbname,String collectionName){ var result = new HashSet<String>(); /* ToDo */ return result; } }
java