在 AWS Lambda 中解析 Kinesis 数据流 Java

Parse Kinesis data stream in AWS Lambda Java

我正在 Java 中创建一个 AWS Lambda 函数来处理 Kinesis 数据流。

我当前的解析设置包括:

  1. 按照 AWS 文档中的建议使用 UTF-8 进行字符串化
            for(KinesisEvent.KinesisEventRecord rec : event.getRecords())
            {
                String stringRecords = new String(rec.getKinesis().getData().array(), "UTF-8");

                    pageEventList.add(pageEvent);
            }
            
  1. 使用正则表达式模式清理字符
   a. non-ascii: "[^\x00-\x7F]";
   b. ascii-control-characters: "[\p{Cntrl}&&[^\r\n\t]]";
   c. non-printable-characters: "\p{C}";
  1. 格式化 json 不带方括号和逗号的字符串对象
        int firstBeginningCurlyBracketIndex = cleanString.indexOf("{");
        if (firstBeginningCurlyBracketIndex != -1 ){
            cleanString = cleanString.substring(firstBeginningCurlyBracketIndex + 1);
            cleanString = "[{" + cleanString;
        }

        int lastIndexOfCurlyBracketIndex = cleanString.lastIndexOf("}");
        if (lastIndexOfCurlyBracketIndex != -1) {
            cleanString = cleanString.substring(0, lastIndexOfCurlyBracketIndex);
            cleanString = cleanString + "}]";
        }

        cleanString = cleanString.replaceAll("}\{", "\},\{");

目前,当我走到这一步时,我正在使用 Regex 解析将它们分离并解析为 JSON 对象。参考:How to match string within parentheses (nested) in Java?

        String REGEX_BRACKET_PATTERN_TWO_LAYERS = "(\{(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\})";

        Pattern splitDelRegex = Pattern.compile(REGEX_BRACKET_PATTERN_TWO_LAYERS);
        Matcher regexMatcher = splitDelRegex.matcher(nonAsciiRemovedString);
        List<String> matcherList = new ArrayList<String>();
        while (regexMatcher.find()) {
            String perm = regexMatcher.group(1);
            matcherList.add(perm);
        }

我尝试在第 3 步之后使用 Gson 和 Jackson 来解析字符串-json-数组(参考:How to parse JSON in Java)。解析工作正常,直到随机无效 JSON / 字符串出现在数据流之外并抛出异常 - java.lang.Exception: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 2 column 1 path $

导致此异常的无效 json 看起来像这样:

[

 ...

  {
    "name": "banana"
    "description": "description"
  },
  {
    "name": "orange"
    "description": "description"
  }
GD~
{}
FDSE-}
]

我的问题是:

  1. 由于最后的随机字符串部分非常随机,我很难将整个字符串格式化为有效字符串 json 数组。如果有人有一个好主意来确保这个字符串 json 数组始终有效。

  2. 除了我在将 Kinesis 数据流解析为 Json 数据的步骤中描述的内容外,顺便说一句,它正在使用 REGEX 工作,尽管我仍然注意到末尾的随机字符串,如果有人在此解析过程中有经验,请与社区分享。我觉得关于 Lambda-Kinesis 这个主题的 AWS 文档不够详细,无法确保整个解析过程。

除此之外,我知道这可能只是因为来自数据流的数据质量。如果能听听其他人在处理有关该主题的数据方面的经验,那就太好了。

我尝试使用 Gson 库:

String jsonString = "{\"username\": \"apple2\", \"description\": \"this is an example{where problem is2}\" }";
    
GsonBuilder builder = new GsonBuilder();
Map<String,String> o = (Map<String, String>) builder.create().fromJson(jsonString, Object.class);
    
System.out.println("Map object : " + o);
System.out.println("UserName : " + o.get("username"));
System.out.println("Description : " + o.get("description"));

输出:

Map object : {username=apple2, description=this is an example{where problem is2}}
UserName : apple2
Description : this is an example{where problem is2}