¿Cómo volcar un dict a un archivo json?

239

Tengo un dict como este:

sample = {'ObjectInterpolator': 1629,  'PointInterpolator': 1675, 'RectangleInterpolator': 2042}

No puedo entender cómo volcar el dict a un jsonarchivo como se muestra a continuación:

{      
    "name": "interpolator",
    "children": [
      {"name": "ObjectInterpolator", "size": 1629},
      {"name": "PointInterpolator", "size": 1675},
      {"name": "RectangleInterpolator", "size": 2042}
     ]
}

¿Hay una manera pitónica de hacer esto?

Puedes adivinar que quiero generar un d3mapa de árbol.

holys
fuente

Respuestas:

413
import json
with open('result.json', 'w') as fp:
    json.dump(sample, fp)

Esta es una manera más fácil de hacerlo.

En la segunda línea de código, el archivo result.jsonse crea y se abre como la variable fp.

En la tercera línea, su dict samplese escribe en el result.json!

moobi
fuente
1
@ Danish No lo sé. A menos que ya haya una pregunta sobre SO sobre su problema, debe crear una nueva pregunta que describa su problema. (por cierto, soy simplemente un editor de esas publicaciones)
paradoja de Fermi
8
Consejo: Si no desea escribir en un archivo y solo ve el resultado, intente redirigirlo a stdout: json.dump('SomeText', sys.stdout)
Arindam Roychowdhury
1
@ Dan-ish ¿Has probado json.dump (sample, fp, sort_keys = False)? Suponiendo que entiendo lo que quieres decir.
Chris Larson
3
Es bueno recordar aquí que, a menos que use un OrderedDict(python> 2.7), no hay garantía de que las claves se ordenen de manera particular
prefecto
1
Lanza el
40

Combine la respuesta de @mgilson y @gnibbler, encontré que lo que necesitaba era esto:


d = {"name":"interpolator",
     "children":[{'name':key,"size":value} for key,value in sample.items()]}
j = json.dumps(d, indent=4)
f = open('sample.json', 'w')
print >> f, j
f.close()

De esta manera, obtuve un archivo json con una bonita impresión. Los trucos print >> f, jse encuentran desde aquí: http://www.anthonydebarros.com/2012/03/11/generate-json-from-sql-using-python/

holys
fuente
16
print(j, file=f)en Python 3.6 (en lugar de print >> f, j)
mjkrause
print(j, file=f)no funcionó para mí, no necesitaba hacer la parte J también. d = {'a':1, 'b':2} print(d, file=open('sample.json', 'wt'))trabajó.
HS Rathore
21
d = {"name":"interpolator",
     "children":[{'name':key,"size":value} for key,value in sample.items()]}
json_string = json.dumps(d)

Por supuesto, es poco probable que el orden se conserve exactamente ... Pero esa es solo la naturaleza de los diccionarios ...

mgilson
fuente
66
json_string = json.dumps (d`` sort_keys = True) si se desea el orden ordenado.
Chris Larson
13

Esto debería darte un comienzo

>>> import json
>>> print json.dumps([{'name': k, 'size': v} for k,v in sample.items()], indent=4)
[
    {
        "name": "PointInterpolator",
        "size": 1675
    },
    {
        "name": "ObjectInterpolator",
        "size": 1629
    },
    {
        "name": "RectangleInterpolator",
        "size": 2042
    }
]
John La Rooy
fuente
1

con formato de impresión bonita:

import json

with open(path_to_file, 'w') as file:
    json_string = json.dumps(sample, default=lambda o: o.__dict__, sort_keys=True, indent=2)
    file.write(json_string)
jmhostalet
fuente