Skip to content

Instantly share code, notes, and snippets.

@ghelobytes
Last active May 7, 2020 20:55
Show Gist options
  • Save ghelobytes/72a6ac548b619cded99c7616cfd6bff4 to your computer and use it in GitHub Desktop.
Save ghelobytes/72a6ac548b619cded99c7616cfd6bff4 to your computer and use it in GitHub Desktop.
import json
def mapper(source, template):
def _get(d, keys, splitter="."):
if isinstance(keys, str):
keys = keys.split(splitter)[1:]
if not keys or d is None:
return d
return _get(d.get(keys[0]), keys[1:])
def _map(d=template):
o = {}
for k, v in d.items():
if isinstance(v, dict):
o[k] = _map(v)
else:
o[k] = _get(source, v)
return o
return _map(d=template)
source = {
"name": "ghelo",
"age": 18,
"address": {
"house_no": "1234",
"street": "Hollywood Blvd",
"city": "Los Angeles",
"area_code": "54321"
},
"socmed": {
"fb": {
"username": "ghelobytes"
},
"twitter": {
"handle": "@ghelobytes"
},
"gamestop": {
"sources": ["coins", "elixir"]
}
},
"pets": ["dog", "cat"]
}
mapping_template = {
"name": "@src.name",
"fb_account": "@src.socmed.fb.username",
"twitter_account": "@src.socmed.twitter.handle",
"user": {
"age": "@src.age",
"health": {
"sources": "@src.socmed.gamestop.sources"
}
},
"pet": {
"domestic": {
"alive": "@src.pets"
}
},
"city": "@src.address.city"
}
r = mapper(source, mapping_template)
r = json.dumps(r, indent=4)
print(r)
{
"name": "ghelo",
"fb_account": "ghelobytes",
"twitter_account": "@ghelobytes",
"user": {
"age": 18,
"health": {
"sources": [
"coins",
"elixir"
]
}
},
"pet": {
"domestic": {
"alive": [
"dog",
"cat"
]
}
},
"city": "Los Angeles"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment