code: @Override
    public Map<String, Object> parse(String input)
    {
      try {
        Map<String, Object> map = new LinkedHashMap<>();
        Map<String, Object> document = mapper.readValue(
            input,
            new TypeReference<Map<String, Object>>()
            {
            }
        );
        for (Map.Entry<String, Pair<FieldType, JsonPath>> entry : fieldPathMap.entrySet()) {
          String fieldName = entry.getKey();
          Pair<FieldType, JsonPath> pair = entry.getValue();
          JsonPath path = pair.rhs;
          Object parsedVal;
          if (pair.lhs == FieldType.ROOT) {
            parsedVal = document.get(fieldName);
          } else {
            parsedVal = path.read(document, jsonPathConfig);
          }
          if (parsedVal == null) {
            continue;
          }
          parsedVal = valueConversionFunction(parsedVal);
          map.put(fieldName, parsedVal);
        }
        if (useFieldDiscovery) {
          discoverFields(map, document);
        }
        return map;
      }
      catch (Exception e) {
        throw new ParseException(e, "Unable to parse row [%s]", input);
      }
    }
docs: @param input JSON string. The root must be a JSON object, not an array.
  e.g., {"valid": "true"} and {"valid":[1,2,3]} are supported
  but [{"invalid": "true"}] and [1,2,3] are not.
  
  @return A map of field names and values