private void parseJson() throws Exception { // Read JSON source if (data.file != null) { data.jsonReader.readFile(data.filename); } else { if (meta.isReadUrl()) { data.jsonReader.readUrl(data.stringToParse); } else { // read string data.jsonReader.readString(data.stringToParse); } } List<NJSONArray> resultList = new ArrayList<NJSONArray>(); data.nrrecords = -1; data.recordnr = 0; String prevPath = ""; for (int i = 0; i < data.nrInputFields; i++) { String path = meta.getInputFields()[i].getPath(); NJSONArray ja = data.jsonReader.getPath(path); if (data.nrrecords != -1 && data.nrrecords != ja.size() && !ja.isNull()) { throw new KettleException( BaseMessages.getString( PKG, "JsonInput.Error.BadStructure", ja.size(), path, prevPath, data.nrrecords)); } resultList.add(ja); if (data.nrrecords == -1 && !ja.isNull()) { data.nrrecords = ja.size(); } prevPath = path; } data.resultList = new ArrayList<NJSONArray>(); Iterator<NJSONArray> it = resultList.iterator(); while (it.hasNext()) { NJSONArray j = it.next(); if (j.isNull()) { if (data.nrrecords == -1) { data.nrrecords = 1; } // The object is empty means that we do not // find Json path // We need here to create a dummy structure j = new NJSONArray(); for (int i = 0; i < data.nrrecords; i++) { j.add(null); } } data.resultList.add(j); } resultList = null; if (log.isDetailed()) { logDetailed(BaseMessages.getString(PKG, "JsonInput.Log.NrRecords", data.nrrecords)); } }
public NJSONArray getPath(String value) throws KettleException { try { String ro = getInvocable().invokeFunction(JSON_PATH, value).toString(); if (!ro.equals(EVAL_FALSE)) { NJSONArray ra = new NJSONArray((JSONArray) JSONValue.parse(ro)); return ra; } else { if (!isIgnoreMissingPath()) throw new KettleException( BaseMessages.getString(PKG, "JsonReader.Error.CanNotFindPath", value)); } } catch (Exception e) { throw new KettleException(e); } // The Json Path is missing // and user do not want to fail // so we need to populate it with NULL values NJSONArray ja = new NJSONArray(); ja.setNull(true); return ja; }