Warum muss der HTTP-POST-Anforderungshauptteil in Python mit JSON verbunden sein?

Ich bin auf dieses Problem gestoßen, als ich mit einer externen API herumgespielt habe. Ich habe meine Körperdaten als Wörterbuch direkt in die Anfrage gesendet und 400 Fehler erhalten:

data = {
  "someParamRange": {
    "to": 1000, 
    "from": 100
  }, 
  "anotherParamRange": {
    "to": True, 
    "from": False
  }
}

Wenn ich einen json.dumps-Wrap hinzugefügt habe, funktioniert es:

data = json.dumps({
  "someParamRange": {
    "to": 1000, 
    "from": 100
  }, 
  "anotherParamRange": {
    "to": True, 
    "from": False
  }
})

Ich verstehe nicht ganz, warum dies notwendig ist, da Wörterbücher und JSON-Objekte syntaktisch identisch sind. Kann mir jemand helfen zu verstehen, was hier hinter den Kulissen vor sich geht?

Der Vollständigkeit halber hier meine Überschriften:

headers = {'API-KEY': 'blerg', 'Accept-Encoding': 'UTF-8', 'Content-Type': 'application/json', 'Accept': '*/*', 'username': 'user', 'password': 'pwd'}

BEARBEITEN:

Ich habe das vorher nicht erwähnt, aber jetzt habe ich das Gefühl, dass es relevant sein könnte. Ich verwende die Python Requests-Bibliothek, und in einem anderen Beitrag wird anscheinend vorgeschlagen, dass Sie niemals Parameter für ein Anforderungsobjekt codieren müssen:https://stackoverflow.com/a/14804320/1012040

"Unabhängig davon, ob GET / POST Sie nie wieder Parameter codieren müssen, wird einfach ein Wörterbuch als Argument herangezogen und es kann losgehen."

Scheint, als sollte eine Serialisierung nicht notwendig sein?

Mein Anforderungsobjekt:

response = requests.post(url, data=data, headers=headers)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage