java - 将 Avro Schema 转换为带有值的 JSON 有效负载
问题描述
我有一个 org.apache.avro.Schema 对象。我需要创建一个 JSON 完整有效负载,其中包含字段中的值。我宁愿说我有使用这篇文章的解决方案
但
RandomData.generate方法中的逻辑很难理解,调试因为它使用递归:private Object generate(Schema schema, Random random, int d)
有没有人有任何其他实现以更具可读性的方式实现目标?我将研究除 RandomData 实现之外的其他解决方案。
解决方案
如果您对使用 Python 没问题,那么最近添加了一个可以做我认为您正在寻找的东西。您应该能够pip install fastavro
然后运行类似以下脚本的内容:
from fastavro import json_writer
from fastavro.utils import generate_many
from io import StringIO
schema = {
"namespace": "my.test",
"name": "example_value_schema",
"type": "record",
"fields": [
{
"name": "field",
"type": [
"null",
"int",
{
"type": "record",
"name": "my_field_type2",
"fields": [
{"name": "subfield", "type": "string"},
{"name": "bytes_field", "type": "bytes"},
{"name": "array_field", "type": {"type": "array", "items": "string"}},
]
}
]
}
]
}
sio = StringIO()
json_writer(sio, schema, generate_many(schema, 6))
print(sio.getvalue())
我运行它时的输出如下:
{"field": null}
{"field": {"int": 1903741208}}
{"field": {"my.test.my_field_type2": {"subfield": "TXJrWrluTg", "bytes_field": "\u0084\u008fEf\u0014\u00f4U\u00ba\u00f4]", "array_field": ["zdXQkoeFQv", "SCWCJmMsOd", "HeISJlaUoE", "qxptYDFfsb", "TcOiaLrXDA", "vOyWPySldE", "HOoeLYRVhS", "lUjhemxuSQ", "fiBdeeUSpZ", "AqTBRFpNoU"]}}}
{"field": null}
{"field": {"int": 1048727191}}
{"field": {"my.test.my_field_type2": {"subfield": "jzZYVZMdXq", "bytes_field": "\u0098Y\u00c5\u00f1\u0095\u009b\u00fd\u008bU]", "array_field": ["xyPsFLOhDp", "lSIWrETtvP", "NHmfWoOCGI", "iqtjfwmQNd", "hlENhjDOse", "oMQpJPkgQY", "eoIRSOydWj", "UChETKEaAk", "JlqxqDrCyH", "RyrLAxoePf"]}}}
您可以看到,对于联合案例,它将尝试为生成的每个随机记录循环遍历不同的联合案例。
推荐阅读
- apache-spark - Pyspark 中的 ORC 条纹大小设置或缩放问题
- swift - 递归函数的大 O
- visual-studio - 转向微软混合
- project-reactor - 是否可以通过 Reactor 3.0 以编程方式查找上游发布者?
- c# - 继承:内部类与内部接口
- qt - 如何在我的应用程序中使用 Poppler-QML-plugin?
- javascript - 将图像的主色设置为子 div - jquery.fillcolor.js
- django - Wagtail:将“UserProfile.submitted_notifications”的默认设置从“True”更改为“False”
- tableau-api - Tableau - 多个标准的最新记录
- c# - 为什么 Xaml 在运行时反序列化 - 而不是在编译时?