2017-08-04 44 views
1

我有一个PostgreSQL数据库表,它具有JSON数据类型列。当我在数据库中存储JSON字符串时,None未被保留。这可以用这个代码片段被复制:在Postgres中存储JSON时保留Python无/ NULL

import json,psycopg2 

dictionary = {} 
dictionary[None] = 0 

conn = psycopg2.connect("host='localhost' dbname='testdb' user='postgres' 
password='postgres'") 
cursor = conn.cursor() 

cursor.execute("""INSERT INTO testtable (json_column) VALUES (%s)""", 
(json.dumps(dictionary),)) 
cursor.execute("""SELECT json_column FROM testtable""") 
result = cursor.fetchall()[0][0].keys()[0] 

print result 
print type(result) 
if result is None: 
    print 'result is None' 
else: 
    print 'result is not None' 

这个Python代码的输出是:

[email protected]:~/python$ python test.py 
null 
<type 'unicode'> 
result is not None 
[email protected]:~/python$ 

我如何可以存储None作为JSON列的关键? JSON对象还具有用于'None''null'的键,因此存储的值必须是Nonenull

+0

你做错了。你应该在PostgreSQL中使用[JSON *列类型](https://stackoverflow.com/questions/45150617/adding-dict-object-to-postgresql)... –

+0

你不能有'None'(或'null',JSON等价物)是JSON对象中的关键字。你的字典只是与JSON格式不兼容。 – user2357112

回答

2

RFC 7159

一个目的结构被表示为一对大括号 的周边零个或多个名称/值对(或成员)。 名称是 字符串。

而且从Python docs

键在键/ JSON的值对类型STR的始终。 当 字典转换为JSON时,字典中的所有键都被强制为字符串 。

JSON 没有非字符串字典键的任何概念。如果你想要这些,你不需要JSON。您用JSON得到的最接近的值是检测到字符串None被转换为并希望您永远不需要实际使用字符串'null'作为字典键。

+0

是否有另外一种可处理非字符串键的类似字典的数据类型? – Drew

+0

@德鲁:您可能对[YAML]感兴趣(https://en.wikipedia.org/wiki/YAML)。 – user2357112