docs: public static TimeSeriesGenerator fromJson(String jsonFileName)
              throws IOException, InvalidKerasConfigurationException {
          String json = new String(Files.readAllBytes(Paths.get(jsonFileName)));
          Map<String, Object> timeSeriesBaseConfig = parseJsonString(json);
          Map<String, Object> timeSeriesConfig;
          if (timeSeriesBaseConfig.containsKey("config"))
              timeSeriesConfig = (Map<String, Object>) timeSeriesBaseConfig.get("config");
          else
              throw new InvalidKerasConfigurationException("No configuration found for Keras tokenizer");
  
  
          int length = (int) timeSeriesConfig.get("length");
          int samplingRate = (int) timeSeriesConfig.get("sampling_rate");
          int stride = (int) timeSeriesConfig.get("stride");
          int startIndex = (int) timeSeriesConfig.get("start_index");
          int endIndex = (int) timeSeriesConfig.get("end_index");
          int batchSize = (int) timeSeriesConfig.get("batch_size");
  
          boolean shuffle = (boolean) timeSeriesConfig.get("shuffle");
          boolean reverse = (boolean) timeSeriesConfig.get("reverse");
  
  
          Gson gson = new Gson();
          List<List<Double>> dataList = gson.fromJson((String) timeSeriesConfig.get("data"), new TypeToken<List<List<Double>>>() {}.getType());
          List<List<Double>> targetsList = gson.fromJson((String) timeSeriesConfig.get("targets"), new TypeToken<List<List<Double>>>() {}.getType());
  
          int dataPoints = dataList.size();
          int dataPointsPerRow = dataList.get(0).size();
  
  
          INDArray data = Nd4j.create(dataPoints, dataPointsPerRow);
          INDArray targets = Nd4j.create(dataPoints, dataPointsPerRow);
          for (int i = 0; i < dataPoints; i ++) {
              data.put(i, Nd4j.create(dataList.get(i)));
              targets.put(i, Nd4j.create(targetsList.get(i)));
          }
  
  
          TimeSeriesGenerator gen = new TimeSeriesGenerator(data, targets, length,
                  samplingRate, stride, startIndex, endIndex, shuffle, reverse, batchSize);
  
          return gen;
      }