2013-05-03 141 views
1

我想知道使用Avro模式来验证应用程序中附带的JSON的可行性。在this post中,Doug Cutting建议使用avro-tools jar附带的jsontofrag工具。他的例子是JSON“文件”,这只是一些微不足道的一个:如何使用Avro模式来验证JSON?

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

虽然这工作,我想知道如何与一个更有趣的JSON文档做到这一点。

当我尝试这与示例JSON文档和架构的Avro公司网站失败了,像这样的:

的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: [email protected]; line: 1, column: 2] 

如何使这项工作任何想法?或者使用Avro模式来验证JSON的另一种方法?

回答

2

jsontofrag工具的用法(和回溯)有很多不足之处; “模式”意味着什么是文字模式字符串,而不是包含模式的文件名。 (惊喜!)下面对你的命令进行的调整适用于我:

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

这里我使用旧式的backtics进行命令替换;较新的“$(cat user.avsc)”语法也适用于bash,可能也适用于其他现代(ish)shell。

+0

感谢您澄清混淆语法。我也发现这可以通过使用“fromjson”命令来完成avro jar工具 - 我已经添加了这个答案。 – quux00 2013-08-24 20:01:43

2

fromjsonjsontofrag的替代方案,这可能更容易且更直接。

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

如果JSON无效,这将抛出一个异常,这样就可以用它来验证JSON。