java如何将JSON数组反序列化为Apache beam PCollection<javaObject>
我有这样的数据
[{"ProjectId":1476401625,"ProjectName":"This is project name","ProjectPostcode":4178},{"ProjectId":2343,"ProjectName":"This is project 2 name","ProjectPostcode":5323}]
我需要将其反序列化为Java对象,我使用以下代码:
PCollection<Project> deserialisedProjectObject = projectFile.apply("Deserialize Projects", ParseJsons.of(Project.class))
.setCoder(SerializableCoder.of(Project.class));
但我总是出错
Exception in thread "main" org.apache.beam.sdk.Pipeline$PipelineExecutionException: java.lang.RuntimeException: Failed to parse a com.lendlease.dp.entity.Project from JSON value: [{"ProjectId":1476401625,"ProjectName":"This is project name","ProjectPostcode":4178},{"ProjectId":2343,"ProjectName":"This is project 2 name","ProjectPostcode":5323}]
如果我将代码更改为:
PCollection<Project[]> deserialisedProjectObject = projectFile.apply("Deserialize Projects", ParseJsons.of(Project[].class))
.setCoder(SerializableCoder.of(Project[].class));
跑步者可以反序列化它,但我需要这一行来返回项目集合;不是项目数组的集合
# 1 楼答案
您从Project[]对象开始,因此解析是正确的。要从该对象中提取项目对象,只需在ParseJson之后应用FlatMap转换,输出数组中的元素
以及您可能想查看的ParseJson:
JsonToRow
它的输出是一个Row对象,可以用作schema,它提供了很多很好的功能,请参见using schemas。如果需要管道中的实际POJO以及行对象,可以使用Convert.fromRow将其转换为POJO对象