我想序列化一个JSON对象,该对象具有可能可变数量的键,代表手机设备ID(由于Android和iPhone的差异).例如,JSON对象可能看起来像这样(对于Android):
"deviceids":{
"openudid":"",
"androidid":"dcbfXXXXXc2d5f",
"imei":"3533XXXXX941712"
}
Run Code Online (Sandbox Code Playgroud)
而iPhone看起来像这样:
"deviceids":
{
"openudid":"37368a5361XXXXXXXXXXdaedc186b4acf4cd4",
"ifv":"BD87ECBF-XXXXXXXXXX-DDF46E18129A",
"mac":"XXXXXXXXXX",
"odin":"2f5672cXXXXXXXXXX2022a5349939a2d7b952",
"ifa":"82F7B2AXXXXXXXXXX5-A2DADA99D05B"
}
Run Code Online (Sandbox Code Playgroud)
在Avro中,我认为这样的架构可以解释差异:
{
"name":"deviceids",
"type":"record",
"fields":[
{
"type":"array",
"items":{
"type":"map",
"values":"string"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是有效的Avro架构吗?
是的,地图是数组的有效类型.然而,您的特定架构不合法,因为它应该是合法的
{
"name":"deviceids",
"type":"record",
"fields":[
{ "name": "arrayOfMaps",
"type":{
"type": "array",
"items":{
"type":"map",
"values":"string"
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
也就是说,必须命名记录的字段,并且数组和映射的类型定义都必须是完整定义,同时给出外部复杂类型(映射/数组)和包含类型.
由于有时很难根据可用的文档和示例存储库来回答特定的Avro问题,回答这类问题的最简单方法可能就是尝试使用Avro工具jar来编译它,它可以在Avro版本中的常规罐子.
java -jar avro-tools-1.7.5.jar compile schema /path/to/schema .
Run Code Online (Sandbox Code Playgroud)
这将很快解决对其是否有效的担忧.如果仍然无法解决问题,Avro邮件列表似乎相当活跃.
| 归档时间: |
|
| 查看次数: |
9006 次 |
| 最近记录: |