【问题标题】:How do I use an Avro schema to validate JSON?如何使用 Avro 模式来验证 JSON?
【发布时间】:2013-05-03 01:53:09
【问题描述】:

我想知道使用 Avro 架构来验证进入我的应用程序的 JSON 的可行性。在this post 中,Doug Cutting 建议使用 avro-tools jar 附带的jsontofrag 工具。他的示例是一个简单的 JSON“文档”,它只是一个数字:

echo 2 | java -jar avro-tools.jar jsontofrag '"int"' - | java -jar avro-tools.jar fragtojson '"int"' - 

虽然这可行,但我想知道如何使用更有趣的 JSON 文档来做到这一点。

当我在 Avro 网站上使用示例 JSON 文档和架构尝试此操作时,它会失败,如下所示:

Avro 架构:

{"namespace": "example.avro",
 "type": "record",
 "name": "User",
 "fields": [
     {"name": "name", "type": "string"},
     {"name": "favorite_number",  "type": ["int", "null"]},
     {"name": "favorite_color", "type": ["string", "null"]}
 ]
}

示例 JSON 文档

{"name": "Ben",
 "favorite_number": 7,
 "favorite_color": "red"}

但是当我尝试这样做时:

cat user.json | java -jar avro-tools.jar jsontofrag user.avsc - | java -jar avro-tools.jar fragtojson user.avsc -

它得到这个错误(堆栈跟踪省略):

Exception in thread "main" org.apache.avro.SchemaParseException: org.codehaus.jackson.JsonParseException: 
Unexpected character ('u' (code 117)): 
expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: java.io.StringReader@74dca977; line: 1, column: 2]

关于如何完成这项工作的任何想法?还是使用 Avro 模式验证 JSON 的另一种方式?

【问题讨论】:

    标签: json validation avro


    【解决方案1】:

    jsontofrag 工具的使用(和回溯)还有很多不足之处; “模式”的含义是文字模式字符串,而不是包含模式的文件名。 (惊喜!)您的命令的以下调整对我有用:

    cat user.json | java -jar avro-tools.jar jsontofrag "`cat user.avsc`" - | java -jar avro-tools.jar fragtojson "`cat user.avsc`" -
    

    这里我使用了老式的反引号来代替命令;较新的 "$(cat user.avsc)" 语法也适用于 bash 并且可能适用于其他现代(ish)shell。

    【讨论】:

    • 感谢您澄清令人困惑的语法。我还发现这可以通过 avro jar 工具的“fromjson”命令来完成 - 我也将其添加为答案。
    【解决方案2】:

    fromjsonjsontofrag 的替代品,可能更简单、更直接。

    java -jar avro-tools.jar fromjson --schema-file user.avsc user.json > user.avro
    

    如果 JSON 无效,则会抛出异常,因此可以使用它来验证 JSON。

    【讨论】:

    • 预期 1 个参数:输入文件
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2020-02-23
    • 2023-03-14
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多