private HashMap<String, String> jsonValues(String jsonObject) throws IOException {
        HashMap<String, String> tree = new HashMap<>();
        // remove object brackets at start and end
        jsonObject = jsonObject.substring(1, jsonObject.length() - 1);
        while (!jsonObject.isEmpty()) {
            // reading the key is easy: it is always bracketed by " " and goes up to the ':'
            int splitIndex = jsonObject.indexOf(":");
            int keyStart = jsonObject.indexOf(ESCAPE) + 1;
            int keyStop = splitIndex - 1;
            if (keyStart >= keyStop) {
                throw new IOException("JsonConverter: messy JSON!");
            }
            String key = jsonObject.substring(keyStart, keyStop);
            // now the tricky part: getting the complete value, independent of type and complexity
            int valueStart = splitIndex + 1;
            // + valueStart because the method is relative
            int valueStop = valueStart + findEndBracket(jsonObject.substring(valueStart));
            // +1 because of substring exclusion
            String value = jsonObject.substring(valueStart, valueStop + 1);
            // must unpack value if only simple value (" ")
            if (value.startsWith("\"")) {
                value = value.substring(1, value.length() - 1);
            }
            // shift jsonObject to remove read json
            if (valueStop + 1 > jsonObject.length()) {
                // need to catch greater value if we're done as otherwise it is out of bounds
                jsonObject = "";
            } else {
                jsonObject = jsonObject.substring(valueStop + 1);
            }
            // check against ignoreField
            if (ignoreFields.contains(key)) {
                continue;
            }
            // add key:value to hashmap
            tree.put(key, value);
        }
        return tree;
    }