Joe F.
Joe F.

Reputation: 867

Formatting dicts and nested dicts

Amazon's DynamoDB requires specially formatted JSON when inserting items into the database.

I have a function that takes a dictionary and transforms values into a nested dict formatted for insertion; the value is transformed into a nested dict where the nested key is the value's data type.

For example, input like {'id':1, 'firstName':'joe'} would be transformed to {'id': {'N':1}, 'firstName': {'S':'joe'}}

This is currently successful with this function:

type_map = {
        str:'S', unicode:'S', dict:'M',
        float:'N', int:'N', bool:'BOOL'
        }

def format_row(self, row):
    """ Accepts a dict, formats for DynamoDB insertion. """

    formatted = {}
    for k,v in row.iteritems():
        type_dict = {}
        type_dict[ self.type_map[type(v)] ] = v
        formatted[k] = type_dict

    return formatted

I need to modify this function to handle values that might be dicts.

So, for example:

 {
 'id':1, 
 'a':{'x':'hey', 'y':1}, 
 'b':{'x':1}
 }

Should be transformed to:

 {
 'id': {'N':1}, 
 'a':{'M': {'x': {'S':'hey'}, 'y':{'N':1}}}, 
 'b': {'M': {'x': {'N':1}}}
 }

I'm thinking the correct way to do this must be to call the function from within the function right?

Note: I'm using Python 2.7

Upvotes: 0

Views: 205

Answers (1)

Joe F.
Joe F.

Reputation: 867

What ultimately ended up working for me was the following function:

def format_row(self, row):
    """ Accepts a dict, formats for DynamoDB insertion. """

    formatted = {}
    for k,v in row.iteritems():
        if type(v) == dict:
            v = self.format_row(v)
            type_dict = {}
            type_dict['M'] = v
            formatted[k] = type_dict
        else: 
            type_dict = {}
            type_dict[ self.type_map[type(v)] ] = v
            formatted[k] = type_dict
    return formatted

If anyone has a better way of doing this, please let me know!

Upvotes: 1

Related Questions