From 9eb634e3f6255a2b4cd45983634da9049acf6552 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 28 May 2015 19:24:07 +0200 Subject: [PATCH] JSON Parser for custom CSF Format This JSON Parser will read a CSF File, parse it and turn it into a Song, SongInstances and ObjectInstances. --- audio/io/JSONReader.java | 117 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 audio/io/JSONReader.java diff --git a/audio/io/JSONReader.java b/audio/io/JSONReader.java new file mode 100644 index 0000000..9dc4ee3 --- /dev/null +++ b/audio/io/JSONReader.java @@ -0,0 +1,117 @@ +package audio.io; + +import java.awt.Color; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; + +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonReader; + +import audio.ObjectInstance; +import audio.Song; +import audio.SongInstance; + +public class JSONReader { + + public static Song readSong(File f) throws IOException { + + if(!f.exists()) + throw new FileNotFoundException("CSF File does not exist"); + + // Get CSF File + InputStream is = new FileInputStream(f); + + // Read CSF Content + JsonReader rdr = Json.createReader(is); + JsonObject obj = rdr.readObject(); + rdr.close(); + + if(!obj.containsKey("meta") || !obj.containsKey("file") || !obj.containsKey("data")) + throw new IOException("Corrupt CSF File"); + + // Create new Song + Song s = new Song(); + + // Read META data + JsonObject meta = obj.getJsonObject("meta"); + + s.setTitle(meta.getString("title")); + s.setSubtitle(meta.getString("subtitle")); + s.setAuthor(meta.getString("author")); + s.setCreator(meta.getString("creator")); + s.setBPM(meta.getInt("BPM")); + + //Read FILE data + JsonObject file = obj.getJsonObject("file"); + + File audio = new File(file.getString("audio")); + if(!audio.exists() || !audio.getName().endsWith(".mp3")) + throw new FileNotFoundException("Audio file does not exist"); + s.setAudio(audio); + + File background = new File(file.getString("background")); + if(!background.exists() || !(background.getName().endsWith(".jpg") || background.getName().endsWith(".png"))) + throw new FileNotFoundException("Background image does not exist"); + s.setBackground(background); + + File banner = new File(file.getString("banner")); + if(!banner.exists() || !(banner.getName().endsWith(".jpg") || banner.getName().endsWith(".png"))) + throw new FileNotFoundException("Banner image does not exist"); + s.setBanner(banner); + + s.setFile(f); + + //Read Data data + JsonArray data = obj.getJsonArray("data"); + for(int i = 0; i < data.size(); i++) + { + s.addSongInstance( readSongInstance(data.getJsonObject(i)) ); + } + + return s; + } + + private static SongInstance readSongInstance(JsonObject obj) throws IOException { + String difficulty = obj.getString("difficulty"); + SongInstance si = new SongInstance(difficulty); + + JsonArray object = obj.getJsonArray("objects"); + for(int i = 0; i < object.size(); i++) + { + si.addObjectInstance( readObjectInstance(object.getJsonObject(i)) ); + } + + return si; + } + + private static ObjectInstance readObjectInstance(JsonObject obj) throws IOException + { + ObjectInstance oi = new ObjectInstance(); + + oi.setTime(obj.getInt("time")); + oi.setDirection(obj.getInt("direction")); + + Color color; + try { + Field field = Color.class.getField(obj.getString("color").toLowerCase()); + color = (Color)field.get(null); + } catch (Exception e) { + throw new IOException("Cannot read property color from " + obj); + } + oi.setColor(color); + + if(obj.containsKey("hold") && obj.getBoolean("hold")) + { + oi.setHold(obj.getBoolean("hold")); + oi.setLength(obj.getInt("length")); + } + + return oi; + } +}