Ho alcune classi serializzate tramite frugale (questa è un'estensione open source di Thrift ). Il motivo principale per cui questo è rilevante è che il processo di serializzazione è fuori dal mio controllo e deve supportare più lingue, quindi non posso facilmente modificarlo.
Immagina che le mie classi assomiglino a:
class response_component:
value = 'string value'
another_value = 4
another_string = 'another string'
class the_response:
contained = response_component
Questo viene serializzato in json simile a:
{"response": {"the_response": {"value": "string value", "another_value": 4, "another_string": "another string"}}}
Questo può essere interpretato e ricreato dal framework di messaggistica sottostante in classi sul lato destinatario. Quello che mi interessa fare è avere il middleware apportare modifiche agli attributi sottostanti.
Ad esempio, potrei voler cambiare il valore "another_string" nell'esempio di risposta qui per "ciao".
La difficoltà che ho è capire come denotare questo riferimento in modo tale che sia significativo all'interno del contesto json.
Posso fare qualcosa che sembra un hokey come articolare il percorso assoluto attraverso le classi, come RESPONSE.contained.another_string
e poi nel processo di deserializzazione decomprimendo questo (o, in python, facendo una serie di getattr finché non trovo l'ultimo valore. Questo potrebbe sembrare, in Python:
r = the_response()
print(r.contained.another_string)
path = 'the_response.contained.another_string'
v = None
paths = path.split('.')
for p in paths[1:-1]:
if not v: v = r
print(p)
v = getattr(v, p)
setattr(v, paths[-1], 'hello')
print(r.contained.another_string)
comunicato tramite json come:
{"modified_value": {"key": "the_response.contained.another_string", "val": "hello"}}
Tuttavia, io veramente non apprezzo l'approccio del percorso e spero in un modo diverso e migliore per comunicare dove modificare i valori.