2012-12-07 6 views
5

Attualmente sto facendo questo:modo più divinatorio per formattare una stringa JSON da un elenco di tuple

def getJSONString(lst): 
    join = "" 
    rs = "{" 
    for i in lst: 
     rs += join + '"' + str(i[0]) + '":"' + str(i[1]) + '"' 
     join = "," 
    return rs + "}" 

che io chiamo come:

rs = getJSONString([("name", "value"), ("name2", "value2")]) 

E non ha bisogno di essere nidificati (sarà sempre e solo una semplice lista di coppie di valori nominali). Ma sono aperto a chiamare la funzione in modo diverso. Sembra tutto un po 'noioso, c'è un modo più elegante? Questo deve essere eseguito sotto 2.x.

Si noti che questo non è un duplicato di: Python - convert list of tuples to string (a meno che tale risposta possa essere modificata per creare una stringa JSON come output).

modifica: sarebbe meglio passare le coppie di valori nome come dizionario?

risposta

16

C'è un modo molto migliore per generare stringhe JSON: il json module.

import json 
rs = json.dumps(dict(lst)) 

Questa sfrutta il fatto che dict() può prendere una sequenza di coppie di valori-chiave (tuple a due valori) e trasformarla in una mappatura, che il modulo json traduce direttamente ad una struttura oggetto JSON.

Dimostrazione:

>>> import json 
>>> lst = [("name", "value"), ("name2", "value2")] 
>>> rs = json.dumps(dict(lst)) 
>>> print rs 
{"name2": "value2", "name": "value"} 
+0

('datetime.datetime (2012, 12, 7, 10, 53, 22) non è JSON serializzabile',) - questo significa tutti i miei valori devono essere stringhe? (e se lo fanno, c'è un modo carino per farlo accadere?) –

+0

@cskilbeck: sì, gli oggetti 'datetime' non hanno serializzazione * default * per JSON. È necessario trasformarli manualmente in stringhe. –

+0

@cskilbeck: vedere [JSON datetime tra Python e JavaScript] (http://stackoverflow.com/q/455580) –

0
(lambda lst: json.dumps({item[0]:item[1] for item in lst}))([(1,2), (3,4)]) 
+0

se ami lambda, io doo –

+0

'{articolo [0]: oggetto [1] per articolo in lst} == dict (lst)' –

+0

sì, grazie) –