2017-08-01 62 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

{ 
    "fname": { 
     "type": "string" 
    }, 
    "lname": { 
     "type": "string" 
    }, 
} 

我們就需要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

相關問題