1

我想知道使用 Avro 模式来验证进入我的应用程序的 JSON 的可行性。在这篇文章中,Doug Cutting 建议使用jsontofragavro-tools jar 附带的工具。他的示例是一个简单的 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 的方法?

4

2 回答 2

2

fromjson是一种替代方法jsontofrag,可能更容易,更直接。

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

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

于 2013-08-24T20:05:14.823 回答
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。

于 2013-06-06T01:21:00.203 回答