Wie erstelle ich dynamisch ein JSON-Objekt mit Python?

274

Ich bin neu in Python und spiele mit JSON-Daten. Ich möchte ein JSON-Objekt dynamisch erstellen, indem ich einem vorhandenen JSON-Objekt einen Schlüsselwert hinzufüge.

Ich habe folgendes versucht, aber ich bekomme TypeError: 'str' object does not support item assignment:

import json

json_data = json.dumps({})
json_data["key"] = "value"

print 'JSON: ', json_data
Backo
quelle

Antworten:

553

Sie erstellen das Objekt, bevor Sie es in eine JSON-Zeichenfolge codieren:

import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

JSON ist eine Serialisierung Format, Textdaten repräsentiert eine Struktur. Es ist nicht selbst diese Struktur.

Martijn Pieters
quelle
2
Ihre Lösung hat für mich wie ein Zauber gewirkt. Ich konnte die Bedeutung Ihrer letzten Zeile jedoch nicht verstehen. Könnten Sie das bitte etwas näher erläutern? Vielen Dank.
Akki
6
@akki: Das OP hat versucht, die JSON-Zeichenfolge (eine Reihe von Zeichen, die ein Objekt codieren) als das Objekt selbst zu behandeln. Sie haben versucht zu verwenden json_data['key'] = 'value', was nicht funktioniert, da json_dataes sich nicht um ein Python-Wörterbuch handelt.
Martijn Pieters
Kann man bei einem gegebenen Objekt das Objekt irgendwie automatisch in JSON oder ein Wörterbuch umwandeln?
Charlie Parker
@CharlieParker: Das ist viel zu weit gefasst. Python-Objekte spiegeln sich nicht so einfach in JSON wider, da JSON ein recht begrenztes Format mit nur wenigen Datentypen ist. Es gibt hier auf SO bereits viele Fragen, die bestimmte Objekttypen und JSON abdecken , wie z. B. Django- oder SQLAlchemy-Modelle usw.
Martijn Pieters
1
@AlexJohnson: pip listgibt Ihnen die gleichen Informationen und kann JSON ausgeben:pip list --format=json
Martijn Pieters
23

Sie können das Python-Wörterbuch erstellen und es in einer Zeile in JSON serialisieren, und es ist nicht einmal hässlich.

my_json_string = json.dumps({'key1': val1, 'key2': val2})
sscarduzio
quelle
21

Es gibt bereits eine Lösung, mit der Sie ein Wörterbuch (oder ein verschachteltes Wörterbuch für komplexere Daten) erstellen können. Wenn Sie jedoch ein Objekt erstellen möchten, versuchen Sie es vielleicht mit 'ObjDict'. Dies gibt viel mehr Kontrolle über den zu erstellenden JSON, z. B. die Beibehaltung der Reihenfolge, und ermöglicht das Erstellen als Objekt, das möglicherweise eine bevorzugte Darstellung Ihres Konzepts darstellt.

pip install objdict zuerst.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
innov8
quelle
2
genau das habe ich gesucht! Angesichts der Tatsache, dass Diktate ungeordnet sind, können Sie zwar beim Aufrufen nach alphabetischer Reihenfolge sortieren, json.dumpsdh json.dumps(response, sort_keys=True, indent=4)dann bleiben Sie bei der alphabetischen Reihenfolge und nicht bei Ihrer bevorzugten Reihenfolge, Gruppierung und Darstellung
Jonathan
11

Sie könnten EasyDictBibliothek ( doc ) verwenden :

EasyDict ermöglicht den Zugriff auf Dict-Werte als Attribute (funktioniert rekursiv). Eine Punktnotation mit Javascript-ähnlichen Eigenschaften für Python-Diktate.

NUTZUNG

>>> from easydict import EasyDict as edict
>>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> d.foo
3
>>> d.bar.x
1

>>> d = edict(foo=3)
>>> d.foo
3

[ Installation ]:

  • pip install easydict
Benyamin Jafari
quelle
Benyamin, könnten Sie bitte Ihr Beispiel bearbeiten, um die Verwendung mit JSON-Dumps und -Ladungen anzuzeigen?
Thom Ives
7

Alle vorherigen Antworten sind korrekt. Hier ist eine weitere und einfache Möglichkeit, dies zu tun. Erstellen Sie beispielsweise eine Dict-Datenstruktur, um ein Objekt zu serialisieren und zu deserialisieren

( Hinweis Keine ist in Python Null und ich verwende dies absichtlich, um zu demonstrieren, wie Sie Null speichern und in JSON Null konvertieren können.)

import json
print('serialization')
myDictObj = { "name":"John", "age":30, "car":None }
##convert object to json
serialized= json.dumps(myDictObj, sort_keys=True, indent=3)
print(serialized)
## now we are gonna convert json to object
deserialization=json.loads(serialized)
print(deserialization)

Geben Sie hier die Bildbeschreibung ein

grepit
quelle