jsonTableParser function

Data? jsonTableParser({
  1. required Parser parser,
  2. required Data parentData,
  3. required Map<String, Object> allData,
  4. required bool debug,
})

Extracts key-value pairs from JSON data structures Returns Data object with Map of key-value pairs or null if not found

Implementation

Data? jsonTableParser({
  required Parser parser,
  required Data parentData,
  required Map<String, Object> allData,
  required bool debug,
}) {
  printLog("----------------------------------", debug, color: LogColor.yellow);
  printLog("ID: ${parser.id} Parser: JSON Table", debug, color: LogColor.cyan);

  // Get JSON data from parent (try JSON first, then string)
  Object? json = getJsonObject(parentData, debug);
  json ??= getStringObject(parentData);

  // Validate that keys and values selectors are configured
  if (parser.parserOptions?.table?.keys == null ||
      parser.parserOptions?.table?.values == null) {
    printLog(
      "JSON Table Parser: Keys or values are not set!",
      debug,
      color: LogColor.red,
    );
    return null;
  }

  // Extract key-value pairs from JSON data
  Map<String, Object> result = {};
  Data? parsed = jsonParser(
    parser: parser,
    parentData: Data(parentData.url, json),
    allData: allData,
    debug: debug,
  );

  // Process each item in the JSON array/iterable
  if (parsed != null && parsed.obj is Iterable) {
    for (final p in parsed.obj as Iterable) {
      // Extract key using JSON parser
      Data? keyData = jsonParser(
        parser: Parser(
          id: "key",
          parents: ["parent"],
          type: ParserType.json,
          selectors: [parser.parserOptions!.table!.keys],
        ),
        parentData: Data(parentData.url, p),
        allData: allData,
        debug: debug,
      );

      // Extract value using JSON parser
      Data? valData = jsonParser(
        parser: Parser(
          id: "val",
          parents: ["parent"],
          type: ParserType.json,
          selectors: [parser.parserOptions!.table!.values!],
        ),
        parentData: Data(parentData.url, p),
        allData: allData,
        debug: debug,
      );

      // Handle different data types for keys and values
      if (keyData != null && valData != null) {
        if (keyData.obj is String && valData.obj is String) {
          // Simple string key-value pair
          result.addAll({keyData.obj as String: valData.obj as String});
        } else if (keyData.obj is List && valData.obj is List) {
          // Handle lists of keys and values
          if ((keyData.obj as List).length == (valData.obj as List).length) {
            for (int i = 0; i < (keyData.obj as List).length; i++) {
              result
                  .addAll({(keyData.obj as List)[i]: (valData.obj as List)[i]});
            }
          }
        }
      }
    }

    // Remove empty keys and values
    result.removeWhere((key, value) => key.isEmpty);
    result.removeWhere((key, value) => value.toString().isEmpty);
    return Data(parentData.url, result);
  }

  printLog(
    "JSON Table Parser: No data found!",
    debug,
    color: LogColor.orange,
  );
  return null;
}