2016-11-20 1 views
0

Amazon DynamoDB benötigt speziell formatiertes JSON, wenn Elemente in die Datenbank eingefügt werden.Formatieren von Dicts und verschachtelten Dicts

Ich habe eine Funktion, die ein Wörterbuch nimmt und Werte in ein verschachteltes Dict konvertiert, das zum Einfügen formatiert ist; Der Wert wird in ein verschachteltes Diktat umgewandelt, wobei der verschachtelte Schlüssel der Datentyp des Werts ist.

Zum Beispiel Eingabe wie {'id':1, 'firstName':'joe'} würde {'id': {'N':1}, 'firstName': {'S':'joe'}}

umgewandelt werden Dies ist derzeit erfolgreich mit dieser Funktion:

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 

Ich brauche diese Funktion ändern Werte zu handhaben, die dicts sein könnte.

So zum Beispiel:

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

Sollten zu verwandeln:

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

ich die richtige Art und Weise zu denken, dies zu tun sein muss, die Funktion innerhalb der Funktion direkt anrufen?

Hinweis: Ich verwende Python 2.7

Antwort

1

Was endete schließlich nach oben für mich zu arbeiten war die folgende Funktion:

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 

Wenn jemand einen besseren Weg, dies zu tun hat, lassen Sie es mich wissen !

+0

Könnte wer auch immer downvoted hinterlassen Sie bitte einen Kommentar, wie Sie meine Lösung verbessern oder ersetzen? Vielen Dank! –

Verwandte Themen