Dlaczego treść żądania HTTP POST musi być dołączona do JSON w Pythonie?

Wpadłem na ten problem podczas zabawy z zewnętrznym API. Przesyłałem moje dane ciała jako słownik bezpośrednio do żądania i otrzymywałem 400 błędów:

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

Po dodaniu opakowania json.dumps działa:

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

Nie do końca rozumiem, dlaczego jest to konieczne, ponieważ słowniki i obiekty JSON są identyczne składniowo. Czy ktoś może mi pomóc zrozumieć, co dzieje się za kulisami?

Dla kompletności, oto moje nagłówki:

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

EDYTOWAĆ:

Nie wspomniałem o tym wcześniej, ale teraz czuję, że może to być istotne. Używam biblioteki Python Requests, a inny post wydaje się sugerować, że nigdy nie powinno się kodować parametrów do obiektu żądania:https://stackoverflow.com/a/14804320/1012040

„Niezależnie od tego, czy GET / POST nigdy nie będziesz musiał ponownie kodować parametrów, po prostu bierze on słownik jako argument i dobrze jest iść”.

Wydaje się, że serializacja nie powinna być konieczna?

Mój obiekt żądania:

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

questionAnswers(2)

yourAnswerToTheQuestion