我想知道使用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 doc和schema时,它会失败,如下所示:
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 doc
{"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的另一种方法?
答案 0 :(得分:2)
jsontofrag工具的用法(和回溯)还有很多不足之处; “schema”的含义是文字架构字符串,而不是包含架构的文件名。 (惊喜!)以下调整你的命令对我有用:
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。
答案 1 :(得分:2)
fromjson
是jsontofrag
的替代方案,可能更简单,更直接。
java -jar avro-tools.jar fromjson --schema-file user.avsc user.json > user.avro
如果JSON无效,则会抛出异常,因此可以使用它来验证JSON。