【问题标题】:Null instead of None when interpretting JSON?解释 JSON 时为 Null 而不是 None?
【发布时间】:2019-12-27 02:29:47
【问题描述】:

我正在尝试将 JSON 数据发布到远程主机。

当我打开文件并使用导入的 json 库中的 json.load 函数时,它会将所有 null 值转换为 None,所有 true 值为 True,所有 false 值为 False,以保留 Pythonic 字典格式。

而当我使用 read() 方法打开文件时,它会保留原始 json 值,因为整个文件被解释为字符串。如果数据没有丢失 json.load() 否则会提供的类似字典的属性,这会很好。

我有一种预感,远程主机无法解释转换后的值,并向我发送了一个 400 响应并带有格式错误的文本错误。

是否有用于加载 JSON 数据的函数或方法,所以 boolean 和 none 值不是 python 化的?或者在发布请求数据时可以做些什么?

import requests
import json

session = requests

key='REDACTED'

with open('create.json', encoding='utf-8') as json_file:
    #DATA = json.load(json_file)
    DATA = json_file.read()

HEADERS={
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {0}'.format(key)
    }

URL='https://api.digitalocean.com/v2/droplets'

x = session.post(url=URL,headers=HEADERS,data=DATA)
print(x.status_code)
print(json.loads(x.text))

【问题讨论】:

  • 你试过x.json()吗?
  • 使用session.post(url=URL,headers=HEADERS,json=DATA)
  • @juanpa.arrivillaga 是的,有效!

标签: python json python-3.x python-requests


【解决方案1】:

这是对序列化的误解。序列化不是 Python 特定的主题,因为它在不同语言中的工作方式相似。

这个想法很简单。将对象在内存中的表示形式转换为适合文件的格式;通常以后再读一遍。

Python Json 模块

python json 模块分别通过 dumpsloads 函数处理与 json 格式的序列化和反序列化。

假设一个简单的json文件/file.json

{
  "name": "Pedro",
  "awesome": true
}

注意。值本质上是类似 Javascript 的值(因此是 JavaScript 对象表示法名称)。

为了让它在 python 中的任何用途(即if pedro['awesome']: # do something),大多数值都被转换、反序列化为类似 python 的格式。

import json

with open('file.json', 'r') as f:
    data = f.read()
    pedro = json.loads(data)     # this deserializes the JSON data

print(pedro)
print(pedro['awesome'] == True)  # this only works because it was deserialized

data = json.dumps(pedro)         # this serializes the python object to JSON
print(data)

运行此脚本会产生:

{'name': 'Pedro', 'awesome': True}
True
{"name": "Pedro", "awesome": true}

【讨论】:

  • 太糟糕了 json 不得不甩了我才能做到这一点。
  • 是的,这行得通。根据您的回答,我将参数修改为: x = session.post(url=URL,headers=HEADERS,data=json.dumps(DATA))
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多