494 Stimmen

Wie konvertiert man JSON-Daten in ein Python-Objekt?

Ich möchte JSON-Daten in ein Python-Objekt konvertieren.

Ich erhalte JSON-Datenobjekte von der Facebook-API, die ich in meiner Datenbank speichern möchte.

Meine aktuelle Ansicht in Django (Python) ( request.POST enthält das JSON):

response = request.POST
user = FbApiUser(user_id = response['id'])
user.name = response['name']
user.username = response['username']
user.save()
  • Das funktioniert gut, aber wie kann ich komplexe JSON-Datenobjekte behandeln?
  • Wäre es nicht viel besser, wenn ich dieses JSON-Objekt irgendwie in ein Python-Objekt konvertieren könnte, um es einfach zu verwenden?

18voto

sputnikus Punkte 583

Für komplexe Objekte können Sie JSON-Pickle

Python-Bibliothek zur Serialisierung beliebiger Objektgraphen in JSON. Sie kann fast jedes Python-Objekt in JSON umwandeln. Außerdem kann sie das Objekt wieder in Python zurückverwandeln.

17voto

R H Punkte 1315

Wenn Sie Python 3.5+ verwenden, können Sie jsons zur Serialisierung und Deserialisierung in einfache alte Python-Objekte:

import jsons

response = request.POST

# You'll need your class attributes to match your dict keys, so in your case do:
response['id'] = response.pop('user_id')

# Then you can load that dict into your class:
user = jsons.load(response, FbApiUser)

user.save()

Sie könnten auch Folgendes machen FbApiUser erben von jsons.JsonSerializable für mehr Eleganz:

user = FbApiUser.from_json(response)

Diese Beispiele funktionieren, wenn Ihre Klasse aus Python-Standardtypen wie Zeichenketten, Ganzzahlen, Listen, Datumsangaben usw. besteht. Die jsons lib erfordert jedoch Typ-Hinweise für benutzerdefinierte Typen.

13voto

lovasoa Punkte 5768

Wenn Sie Python 3.6+ verwenden, können Sie marshmallow-dataclass . Im Gegensatz zu den oben genannten Lösungen ist sie sowohl einfach als auch typsicher:

from marshmallow_dataclass import dataclass

@dataclass
class User:
    name: str

user = User.Schema().load({"name": "Ramirez"})

8voto

Božo Stojković Punkte 2823

Da niemand eine ähnliche Antwort wie meine gegeben hat, werde ich sie hier veröffentlichen.

Es handelt sich um eine robuste Klasse, die leicht zwischen JSON und str y dict die ich kopiert habe von meine Antwort auf eine andere Frage :

import json

class PyJSON(object):
    def __init__(self, d):
        if type(d) is str:
            d = json.loads(d)

        self.from_dict(d)

    def from_dict(self, d):
        self.__dict__ = {}
        for key, value in d.items():
            if type(value) is dict:
                value = PyJSON(value)
            self.__dict__[key] = value

    def to_dict(self):
        d = {}
        for key, value in self.__dict__.items():
            if type(value) is PyJSON:
                value = value.to_dict()
            d[key] = value
        return d

    def __repr__(self):
        return str(self.to_dict())

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __getitem__(self, key):
        return self.__dict__[key]

json_str = """... JSON string ..."""

py_json = PyJSON(json_str)

8voto

BernhardS Punkte 860

dacite kann auch eine Lösung für Sie sein, es unterstützt folgende Funktionen:

  • geschachtelte Strukturen
  • (grundlegende) Typenprüfung
  • optionale Felder (d.h. Typisierung.Optional)
  • Gewerkschaften
  • Vorwärtsverweise
  • Sammlungen
  • benutzerdefinierte Typenhaken

https://pypi.org/project/dacite/

from dataclasses import dataclass
from dacite import from_dict

@dataclass
class User:
    name: str
    age: int
    is_active: bool

data = {
    'name': 'John',
    'age': 30,
    'is_active': True,
}

user = from_dict(data_class=User, data=data)

assert user == User(name='John', age=30, is_active=True)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X