2013-10-24 30 views
2

我想序列化一個JSON對象,它具有可能的可變數字鍵,代表手機deviceid的(由於Android和iPhone的差異)。 JSON對象可能是這樣的,例如(Android版):是否可以爲地圖數組創建Avro模式?

"deviceids":{ 
     "openudid":"", 
     "androidid":"dcbfXXXXXc2d5f", 
     "imei":"3533XXXXX941712" 
     } 

,而iPhone手機看起來是這樣的:

"deviceids": 
    { 
     "openudid":"37368a5361XXXXXXXXXXdaedc186b4acf4cd4", 
     "ifv":"BD87ECBF-XXXXXXXXXX-DDF46E18129A", 
     "mac":"XXXXXXXXXX", 
     "odin":"2f5672cXXXXXXXXXX2022a5349939a2d7b952", 
     "ifa":"82F7B2AXXXXXXXXXX5-A2DADA99D05B" 
     } 

在Avro的,我想這樣的模式可以解釋的差異:

{ 
     "name":"deviceids", 
     "type":"record", 
     "fields":[ 
     { 
      "type":"array", 
      "items":{ 
      "type":"map", 
      "values":"string" 
      } 
     } 
     ] 
    } 

這個有效的Avro模式?

回答

7

是的,地圖是一個數組的有效類型。您的特定的模式是不合法但是,因爲它應該是

{ 
    "name":"deviceids", 
    "type":"record", 
    "fields":[ 
    { "name": "arrayOfMaps", 
     "type":{ 
      "type": "array", 
      "items":{ 
      "type":"map", 
      "values":"string" 
      } 
     } 
    } 
    ] 
} 

也就是說,你的記錄的字段必須命名和數組類型定義和映射都必須是完整的定義給出兩個外部複雜類型(map/array)和包含的類型。

由於根據可用的文檔和示例的存儲庫回答特定的Avro問題可能很困難,所以回答這類問題的最簡單方法可能是試着使用Avro工具jar進行編譯,它可以可以在Avro releases的常規罐子旁找到。

java -jar avro-tools-1.7.5.jar compile schema /path/to/schema . 

這會很快解決關於它是否有效的擔憂。如果這仍然不能解決問題,Avro mailing lists似乎相當活躍。

相關問題