有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您从Project[]对象开始,因此解析是正确的。要从该对象中提取项目对象,只需在ParseJson之后应用FlatMap转换,输出数组中的元素

    以及您可能想查看的ParseJson:

    JsonToRow

    它的输出是一个Row对象,可以用作schema,它提供了很多很好的功能,请参见using schemas。如果需要管道中的实际POJO以及行对象,可以使用Convert.fromRow将其转换为POJO对象