如何使用Avro架构验证JSON?

时间:2013-05-03 01:53:09

标签: json validation avro

我想知道使用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的另一种方法?

2 个答案:

答案 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)

fromjsonjsontofrag的替代方案,可能更简单,更直接。

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

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