【问题标题】:C# convert AVRO to JSONC# 将 AVRO 转换为 JSON
【发布时间】:2020-05-07 19:04:16
【问题描述】:

是否有 C# 实现来转换 AVRO 反序列化

<GenericRecord>

回到常规的 JSON 格式?我已经成功阅读了来自 Kafka 的主题并使用了AvroDeserializer,但我想将其转换为 JSON 格式。

这是一个例子: 简单的 JSON:

{       
        "value": {
            "eventCreatedTimestamp": 1588694347577,
            "iouDecision": "PLANE",
            "iouDecisionReason": {
                "value": "Optimal"
            }
        }
    }

与 AVRO 反序列化的 Generic.Record 相同:

{Schema: 
{"type":"record","name":"TheCustomerDecisionEvent",
"namespace":"com.farmxxx.tst.property.service.options.iou.messaging.avro","fields":
[{"name":"eventCreatedTimestamp","type":["null","long"]},
{"name":"iouDecision","type":["null",{"type":"enum",
"name":"TheType",
"namespace":"com.farmxxx.tst.property.service.options.iou.messaging.avro",
"symbols":["HRMR","FIELD","PLANE"]}]},
{"name":"iouDecisionReason","type":["null",{"type":"record","name":"iouDecisionReason",
"namespace":"com.farmxxx.tst.property.service.options.iou.messaging.avro",
"fields":[{"name":"value","type":["null","string"]}]}]}]}
,
 contents: { eventCreatedTimestamp: 1588694347577, 
 iouDecision: Schema: {"type":"enum","name":"TheType",
 "namespace":"com.farmxxx.tst.property.service.options.iou.messaging.avro",
 "symbols":["HRMR","FIELD","PLANE"]}, value: PLANE,
 iouDecisionReason: Schema: {"type":"record","name":"iouDecisionReason",
"namespace":"com.farmxxx.tst.property.service.options.iou.messaging.avro",
"fields":[{"name":"value","type":["null","string"]}]}, contents: { value: Optimal, }, }}

所以任务是从 AVRO Generic.Record 返回到 Simple JSON。

【问题讨论】:

标签: c# json avro


【解决方案1】:

可以使用以下方法找到解决方案:

https://github.com/AdrianStrugala/AvroConvert

Avro2Json 功能。

通过它,您可以从 Kafka 读取主题并将其转换为简单的 JSON。 我使用那个简单的 JSON 传递给其他不想了解 AVRO 记录格式等的客户。

非常感谢 AvroConvert Github 存储库的作者。

【讨论】:

  • PS:它不是免费工具
【解决方案2】:

正如 cmets 中所建议的,我过去曾为此使用过 https://github.com/kristofferjalen/AvroConverter(我与该项目无关)。

该页面的自述文件表明它非常易于使用。只需在包管理器命令行中输入Install-Package AvroConverter(如果不使用 Visual Studio,则输入您的 CLI)从 NuGet 安装其包,然后从您的代码中使用以下代码调用它:

var path = @"C:\your\avro\file\path.avro";
var fileInfo = new System.IO.FileInfo(path);
var json = AvroConvert.ToJson(fileInfo);

【讨论】:

  • 这适用于文件,但我收到一个 Kafka 主题,这意味着我一次处理一条记录。反序列化的 Avro Generic 记录中嵌入了模式。这是为 Avro 设计的,但在与其他只需要简单 JSON 的客户端进行通信时,这不是您想要的,而我试图从 Avro 记录中删除其他模式详细信息并仅传递简单的 JSON 键:值对谢谢
  • 我不知道您使用单个或多个记录很重要,因为源表明它也支持从流中读取。如果只是从记录中排除一些反序列化的属性,并且您知道接收到的数据的形状,为什么不简单地将生成的反序列化 JSON 映射到一个更干净的对象,而不需要额外的模式字段?
  • 我正在尝试使 JSON 对象具有通用性,而不是将其映射到特定对象。只需将其传递给另一个不想了解 AVRO 和嵌入式模式的客户即可。如果有帮助,我可以举个例子
  • 看来,如果您按照上述方法获得了 JSON 格式的数据,那么现在您面临的挑战是将其反序列化为更强大的类型,并且您在JSON -> .NET 空间比 AVRO -> .NET。为什么不能按原样存储 JSON 并在随后将其转换为强类型对象时忽略任何多余的内容?大概你对它可以反序列化到的类型领域有所了解,或者无论如何你在对象中都有类型信息。
猜你喜欢
  • 2020-07-13
  • 2020-05-20
  • 2020-10-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
相关资源
最近更新 更多