2017-08-01 1 views
1

現在、私たちはユーザーを管理するための社内サービスを構築しています。私たちの課題は、異種のフォーマットを持つ複数のサードパーティ製システムと同期することです(ただし、すべてJSONにあります)。複数の他のフォーマットに属性をマッピングするPython

例として、当社のユーザーのスキーマは、我々はすべて、または一部のフィールド

がある可能性がありますいくつかの他のベンダのためのデータセットを変換する必要があり、後の時点で、以下の

{ 
"title": "User Schema", 
"type": "object", 
"properties": { 
    "firstName": { 
     "type": "string" 
    }, 
    "lastName": { 
     "type": "string" 
    }, 
    "email": { 
     "type": "string" 
    } 
"required": ["firstName", "lastName"] 
} 

ようになります。

ベンダー1

{ 
    "first_name": { 
     "type": "string" 
    }, 
    "last_name": { 
     "type": "string" 
    }, 
} 

ベンダー2

firstNameとlastNameは、各ベンダーの上記の代替フォーマットにそれぞれマップする必要があります。私は、このデータをJSONスキーマに押し込んで、Pythonで容易に変換できるようになっているように感じます。

基本的にはデータ変換だけです。変換に役立つ標準的なフォーマットやパッケージがPythonにはありますか?

私は以下の何かが出発点になるとは思っていますが、わかりません。

{ 
"title": "User Schema", 
"type": "object", 
"properties": { 
    "firstName": { 
     "type": "string", 
     "vendorMap" { 
      "vendor1": "first_name", 
      "vendor2": "last_name" 
     } 
    }, 
    "lastName": { 
     "type": "string" 
    }, 
    "email": { 
     "type": "string" 
    } 
"required": ["firstName", "lastName"] 
} 

答えて

0

あなたは、各ベンダーのための辞書とそのマッピングを作成することができます。

transformers = {'v2': { 
        'fname': 'first_name', 
        'lname': 'last_name'}} 

vendor = 'v2' 
# Sample data from vendor 'v2'. 
v2 = { 
    "fname": "John", 
    "lname": "Smith", 
    "email": "[email protected]", 
    "random": "randomly keyed data" 
} 

# Convert data into standard form. 
transformed_data = { 
    transformers[vendor].get(k, k) if vendor in transformers else k: v 
    for k, v in v2.iteritems()} 

>>> transformed_data 
{'email': '[email protected]', 
'first_name': 'John', 
'last_name': 'Smith', 
'random': 'randomly keyed data'} 

順序が重要な場合、これは私が考えていたものに近い見えますOrderedDict

+0

を使用することを検討してください。私は、複数のスキーマをより良く統合できることを期待していましたが、トランスは理にかなっています。 – CogitoErgoSum

+0

JSONを最初に検証するために、スキーマに同じアプローチを使用できます。しかし、それでも標準フォーマットにする必要があります。 – Alexander

関連する問題