在 AWS Lambda 中解析 Kinesis 数据流 Java
Parse Kinesis data stream in AWS Lambda Java
我正在 Java 中创建一个 AWS Lambda 函数来处理 Kinesis 数据流。
我当前的解析设置包括:
- 按照 AWS 文档中的建议使用 UTF-8 进行字符串化
for(KinesisEvent.KinesisEventRecord rec : event.getRecords())
{
String stringRecords = new String(rec.getKinesis().getData().array(), "UTF-8");
pageEventList.add(pageEvent);
}
- 使用正则表达式模式清理字符
a. non-ascii: "[^\x00-\x7F]";
b. ascii-control-characters: "[\p{Cntrl}&&[^\r\n\t]]";
c. non-printable-characters: "\p{C}";
- 格式化 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-}
]
我的问题是:
由于最后的随机字符串部分非常随机,我很难将整个字符串格式化为有效字符串 json 数组。如果有人有一个好主意来确保这个字符串 json 数组始终有效。
除了我在将 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}
我正在 Java 中创建一个 AWS Lambda 函数来处理 Kinesis 数据流。
我当前的解析设置包括:
- 按照 AWS 文档中的建议使用 UTF-8 进行字符串化
for(KinesisEvent.KinesisEventRecord rec : event.getRecords())
{
String stringRecords = new String(rec.getKinesis().getData().array(), "UTF-8");
pageEventList.add(pageEvent);
}
- 使用正则表达式模式清理字符
a. non-ascii: "[^\x00-\x7F]";
b. ascii-control-characters: "[\p{Cntrl}&&[^\r\n\t]]";
c. non-printable-characters: "\p{C}";
- 格式化 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-}
]
我的问题是:
由于最后的随机字符串部分非常随机,我很难将整个字符串格式化为有效字符串 json 数组。如果有人有一个好主意来确保这个字符串 json 数组始终有效。
除了我在将 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}