【问题标题】:How to deserialize JSON Array to Apache beam PCollection<javaObject>如何将 JSON 数组反序列化为 Apache Beam PCollection<javaObject>
【发布时间】:2020-11-12 21:49:15
【问题描述】:

我有类似的数据

[{"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));

跑步者能够反序列化它,但我需要这一行来返回项目的集合;不是项目数组的集合

【问题讨论】:

  • 如果没有正确的格式真的很难阅读,您可以使用 ``` ``` 表示 json。这样你就会更加关注你的问题

标签: java apache-beam json-deserialization


【解决方案1】:

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

除了 ParseJson 你可能还想看看:

JsonToRow

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2022-12-31
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多