568 Stimmen

Umwandlung eines Wörterbuchs in JSON

r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
file.write(str(r['rating']))

Ich kann nicht auf meine Daten im JSON zugreifen. Was mache ich falsch?

TypeError: Stringindizes müssen Ganzzahlen sein, keine Zeichenfolgen

831voto

Iman Mirzadeh Punkte 11410

json.dumps() konvertiert ein Wörterbuch in ein str-Objekt, nicht in ein json(dict)-Objekt! Daher musst du dein str in ein dict laden, um es mit der Methode json.loads() zu verwenden

Betrachte json.dumps() als eine Speichermethode und json.loads() als eine Abrufmethode.

Hier ist der Codeschnipsel, der dir helfen könnte, es besser zu verstehen:

import json

r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
loaded_r = json.loads(r)
loaded_r['rating'] #Ausgabe 3.5
type(r) #Ausgabe str
type(loaded_r) #Ausgabe dict

74voto

Tim Punkte 39551

json.dumps() gibt die JSON-Zeichenfolgenrepräsentation des Python-Dikts zurück. Siehe die Dokumentation

Du kannst nicht r['rating'] machen, weil r jetzt ein String ist und kein Dikt mehr

Vielleicht meintest du etwas wie

r = {'is_claimed': 'True', 'rating': 3.5}
json = json.dumps(r) # beachte, dass ich ihm einen anderen Namen gegeben habe
file.write(str(r['rating']))

59voto

json.dumps() wird verwendet, um JSON-Daten zu decodieren

  • json.loads nimmt eine Zeichenfolge als Eingabe und gibt ein Wörterbuch als Ausgabe zurück.
  • json.dumps nimmt ein Wörterbuch als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück.

    import json

    initialisiere verschiedene Daten

    str_data = 'normale Zeichenfolge' int_data = 1 float_data = 1,50 list_data = [str_data, int_data, float_data] nested_list = [int_data, float_data, list_data] dictionary = { 'int': int_data, 'str': str_data, 'float': float_data, 'list': list_data, 'verschachtelte liste': nested_list }

    konvertiere sie in JSON-Daten und drucke sie dann aus

    print('Zeichenfolge :', json.dumps(str_data)) print('Integer :', json.dumps(int_data)) print('Gleitkommazahl :', json.dumps(float_data)) print('Liste :', json.dumps(list_data)) print('Verschachtelte Liste :', json.dumps(nested_list, indent=4)) print('Wörterbuch :', json.dumps(dictionary, indent=4)) # die JSON-Daten werden eingerückt

Ausgabe:

Zeichenfolge : "normal string"
Integer : 1
Gleitkommazahl : 1.5
Liste : ["normal string", 1, 1.5]
Verschachtelte Liste : [
    1,
    1.5,
    [
        "normal string",
        1,
        1.5
    ]
]
Wörterbuch : {
    "int": 1,
    "str": "normal string",
    "float": 1.5,
    "list": [
        "normal string",
        1,
        1.5
    ],
    "nested list": [
        1,
        1.5,
        [
            "normal string",
            1,
            1.5
        ]
    ]
}
  • Python-Objekt in JSON-Datenkonvertierung

    Python JSON
    dict object
    list, tuple array
    str string
    int, float, int- & float-derived Enums number
    True true
    False false
    None null

UPDATE

In der JSON-Datei

verschachteltes_wörterbuch = {
    'one': nested_list,
    'two': dictionary,

}

json_wörterbuch = {'Verschachteltes Wörterbuch': verschachteltes_wörterbuch,
             'Mehrere':[verschachteltes_wörterbuch, verschachteltes_wörterbuch, verschachteltes_wörterbuch]
            }

with open("test_nested.json", "w") as outfile:
    json.dump(json_wörterbuch, outfile, indent=4, sort_keys=False)

Diagrammantwort

Bildbeschreibung hier eingeben

Ausgabe in test_nested.json

{
    "Verschachteltes Wörterbuch": {
        "one": [
            1,
            1.5,
            [
                "normal string",
                1,
                1.5
            ]
        ],
        "two": {
            "int": 1,
            "str": "normal string",
            "float": 1.5,
            "list": [
                "normal string",
                1,
                1.5
            ],
            "nested list": [
                1,
                1.5,
                [
                    "normal string",
                    1,
                    1.5
                ]
            ]
        }
    },
    "Mehrere": [
        {
            "one": [
                1,
                1.5,
                [
                    "normal string",
                    1,
                    1.5
                ]
            ],
            "two": {
                "int": 1,
                "str": "normal string",
                "float": 1.5,
                "list": [
                    "normal string",
                    1,
                    1.5
                ],
                "nested list": [
                    1,
                    1.5,
                    [
                        "normal string",
                        1,
                        1.5
                    ]
                ]
            }
        },
        {
            "one": [
                1,
                1.5,
                [
                    "normal string",
                    1,
                    1.5
                ]
            ],
            "two": {
                "int": 1,
                "str": "normal string",
                "float": 1.5,
                "list": [
                    "normal string",
                    1,
                    1.5
                ],
                "nested list": [
                    1,
                    1.5,
                    [
                        "normal string",
                        1,
                        1.5
                    ]
                ]
            }
        },
        {
            "one": [
                1,
                1.5,
                [
                    "normal string",
                    1,
                    1.5
                ]
            ],
            "two": {
                "int": 1,
                "str": "normal string",
                "float": 1.5,
                "list": [
                    "normal string",
                    1,
                    1.5
                ],
                "nested list": [
                    1,
                    1.5,
                    [
                        "normal string",
                        1,
                        1.5
                    ]
                ]
            }
        }
    ]
}

Klasse-Instanz in JSON

  • Eine einfache Lösung:

    class Foo(object): def init( self, data_str, data_int, data_float, data_list, data_n_list, data_dict, data_n_dict): self.str_data = data_str self.int_data = data_int self.float_data = data_float self.list_data = data_list self.nested_list = data_n_list self.dictionary = data_dict self.nested_dictionary = data_n_dict

    foo = Foo( str_data, int_data, float_data, list_data, nested_list, dictionary, nested_dictionary)

    Weil das JSON-Objekt ein Python-Wörterbuch ist.

    result = json.dumps(foo.dict, indent=4)

    Siehe Tabelle oben.

    oder mit der integrierten Funktion, die auf .dict zugreift, genannt vars()

    result = json.dumps(vars(foo), indent=4)

    print(result) # wie zuvor

  • Noch einfacher

    class Bar: def toJSON(self): return json.dumps(self, default=lambda o: o.dict, sort_keys=False, indent=4)

    bar = Bar() bar.web = "Stackoverflow" bar.type = "Knowledge" bar.is_the_best = True bar.user = Bar() bar.user.name = "Milovan" bar.user.age = 34

    print(bar.toJSON())

Diagrammantwort

Bildbeschreibung hier eingeben

Ausgabe:

{
    "web": "Stackoverflow",
    "type": "Knowledge",
    "is_the_best": true,
    "user": {
        "name": "Milovan",
        "age": 34
    }
}

6voto

Cody peltz Punkte 39

Sie können im obigen Beispiel ein verschachteltes Wörterbuch erstellen, indem Sie ein neues Wörterbuch innerhalb des Standardwörterbuchs deklarieren.

import json 
dictionary = {
'fruit':{"Trauben": "10","Farbe": "grün"},
'Gemüse':{"Chili": "4","Farbe": "rot"},
}
result = json.dumps(dictionary, indent = 3)

print(result)

Hier habe ich indent=3 verwendet

Referenz: https://favtutor.com/blogs/dict-to-json-python

3voto

user3273866 Punkte 554

Es ist nicht nötig, sie in einen String umzuwandeln, indem json.dumps() verwendet wird

r = {'is_claimed': 'True', 'rating': 3.5}
file.write(r['is_claimed'])
file.write(str(r['rating']))

Sie können die Werte direkt aus dem dict-Objekt erhalten.

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