Пример #1
0
  public boolean init(StepMetaInterface smi, StepDataInterface sdi) {
    meta = (JsonInputMeta) smi;
    data = (JsonInputData) sdi;

    if (super.init(smi, sdi)) {
      data.rownr = 1L;
      data.nrInputFields = meta.getInputFields().length;
      // Take care of variable substitution
      for (int i = 0; i < data.nrInputFields; i++) {
        JsonInputField field = meta.getInputFields()[i];
        field.setPath(environmentSubstitute(field.getPath()));
      }

      try {
        // Init a new JSON reader
        data.jsonReader = new JsonReader();
        data.jsonReader.SetIgnoreMissingPath(meta.isIgnoreMissingPath());

      } catch (KettleException e) {
        logError(e.getMessage());
        return false;
      }
      return true;
    }
    return false;
  }
Пример #2
0
  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));
    }
  }
Пример #3
0
  private Object[] buildRow() throws KettleException {
    // Create new row...
    Object[] outputRowData = null;

    if (data.readrow != null) outputRowData = data.readrow.clone();
    else outputRowData = buildEmptyRow();

    // Read fields...
    for (int i = 0; i < data.nrInputFields; i++) {
      // Get field
      JsonInputField field = meta.getInputFields()[i];

      // get json array for field
      JSONArray jsona = data.resultList.get(i).getJSONArray();
      String nodevalue = null;
      if (jsona != null) {
        Object jo = (Object) jsona.get(data.recordnr);
        if (jo != null) {
          nodevalue = jo.toString();
        }
      }

      // Do trimming
      switch (field.getTrimType()) {
        case JsonInputField.TYPE_TRIM_LEFT:
          nodevalue = Const.ltrim(nodevalue);
          break;
        case JsonInputField.TYPE_TRIM_RIGHT:
          nodevalue = Const.rtrim(nodevalue);
          break;
        case JsonInputField.TYPE_TRIM_BOTH:
          nodevalue = Const.trim(nodevalue);
          break;
        default:
          break;
      }

      if (meta.isInFields()) {
        // Add result field to input stream
        outputRowData =
            RowDataUtil.addValueData(outputRowData, data.totalpreviousfields + i, nodevalue);
      }
      // Do conversions
      //
      ValueMetaInterface targetValueMeta =
          data.outputRowMeta.getValueMeta(data.totalpreviousfields + i);
      ValueMetaInterface sourceValueMeta =
          data.convertRowMeta.getValueMeta(data.totalpreviousfields + i);
      outputRowData[data.totalpreviousfields + i] =
          targetValueMeta.convertData(sourceValueMeta, nodevalue);

      // Do we need to repeat this field if it is null?
      if (meta.getInputFields()[i].isRepeated()) {
        if (data.previousRow != null && Const.isEmpty(nodevalue)) {
          outputRowData[data.totalpreviousfields + i] =
              data.previousRow[data.totalpreviousfields + i];
        }
      }
    } // End of loop over fields...

    // When we have an input stream
    // the row index take care of previous fields
    int rowIndex = data.totalpreviousfields + data.nrInputFields;

    // See if we need to add the filename to the row...
    if (meta.includeFilename() && !Const.isEmpty(meta.getFilenameField())) {
      outputRowData[rowIndex++] = data.filename;
    }
    // See if we need to add the row number to the row...
    if (meta.includeRowNumber() && !Const.isEmpty(meta.getRowNumberField())) {
      outputRowData[rowIndex++] = new Long(data.rownr);
    }
    // Possibly add short filename...
    if (meta.getShortFileNameField() != null && meta.getShortFileNameField().length() > 0) {
      outputRowData[rowIndex++] = data.shortFilename;
    }
    // Add Extension
    if (meta.getExtensionField() != null && meta.getExtensionField().length() > 0) {
      outputRowData[rowIndex++] = data.extension;
    }
    // add path
    if (meta.getPathField() != null && meta.getPathField().length() > 0) {
      outputRowData[rowIndex++] = data.path;
    }
    // Add Size
    if (meta.getSizeField() != null && meta.getSizeField().length() > 0) {
      outputRowData[rowIndex++] = new Long(data.size);
    }
    // add Hidden
    if (meta.isHiddenField() != null && meta.isHiddenField().length() > 0) {
      outputRowData[rowIndex++] = new Boolean(data.path);
    }
    // Add modification date
    if (meta.getLastModificationDateField() != null
        && meta.getLastModificationDateField().length() > 0) {
      outputRowData[rowIndex++] = data.lastModificationDateTime;
    }
    // Add Uri
    if (meta.getUriField() != null && meta.getUriField().length() > 0) {
      outputRowData[rowIndex++] = data.uriName;
    }
    // Add RootUri
    if (meta.getRootUriField() != null && meta.getRootUriField().length() > 0) {
      outputRowData[rowIndex++] = data.rootUriName;
    }
    data.recordnr++;

    RowMetaInterface irow = getInputRowMeta();

    data.previousRow =
        irow == null ? outputRowData : (Object[]) irow.cloneRow(outputRowData); // copy it to make
    // surely the next step doesn't change it in between...

    return outputRowData;
  }