Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将从psycopg2查询返回的有效json字符串转换为可以通过pymongo插入mongo实例的json?_Python_Python 2.7_Pymongo_Psycopg2 - Fatal编程技术网

Python 如何将从psycopg2查询返回的有效json字符串转换为可以通过pymongo插入mongo实例的json?

Python 如何将从psycopg2查询返回的有效json字符串转换为可以通过pymongo插入mongo实例的json?,python,python-2.7,pymongo,psycopg2,Python,Python 2.7,Pymongo,Psycopg2,如何将从psycopg2查询返回的有效json字符串转换为可以通过pymongo插入mongo实例的json?我试过很多方法,都不成功。我在插入mongoTypeError时一直遇到一个TypeError:“str”对象不支持项分配 顺便说一下,我正在使用Python 2.7和psycopg2 2.4.5,以及pymongo 2.1。如果有必要,我可以升级,我只是使用Ubuntu和apt get默认安装了什么 import psycopg2 import pymongo from pymongo

如何将从psycopg2查询返回的有效json字符串转换为可以通过pymongo插入mongo实例的json?我试过很多方法,都不成功。我在插入mongo
TypeError时一直遇到一个TypeError:“str”对象不支持项分配

顺便说一下,我正在使用Python 2.7和psycopg2 2.4.5,以及pymongo 2.1。如果有必要,我可以升级,我只是使用Ubuntu和apt get默认安装了什么

import psycopg2
import pymongo
from pymongo import Connection
import ast
import json

connection = Connection()
db = connection['af_reports_test']
psa = db['psa']


cur = con.cursor()
cur.execute("SELECT activity_json FROM \"edus\".\"ACTIVITIES\" WHERE         status='PUBLISHED'")
results = cur.fetchall()


for rec in results:
    for value in rec:   
        psa.insert(value)
以下是我从数据库中得到的示例:

{"activity":{"to":{"users":["someone","someoneElse"]}}}
此外,以下是回溯:

Traceback (most recent call last):
  File "getPSA.py", line 33, in <module>
    psa.insert(activity)
  File "/usr/lib/python2.7/dist-packages/pymongo/collection.py", line 300, in insert
    docs = [self.__database._fix_incoming(doc, self) for doc in docs]
  File "/usr/lib/python2.7/dist-packages/pymongo/database.py", line 252, in _fix_incoming
    son = manipulator.transform_incoming(son, collection)
  File "/usr/lib/python2.7/dist-packages/pymongo/son_manipulator.py", line 73, in transform_incoming
    son["_id"] = ObjectId()
TypeError: 'str' object does not support item assignment
回溯(最近一次呼叫最后一次):
文件“getPSA.py”,第33行,在
psa.插入(活动)
文件“/usr/lib/python2.7/dist packages/pymongo/collection.py”,第300行,插入
docs=[self.\uuu数据库.\u修复\u文档中的文档的传入(doc,self)]
文件“/usr/lib/python2.7/dist-packages/pymongo/database.py”,第252行,在
son=操纵器。变换_传入(son,集合)
文件“/usr/lib/python2.7/dist packages/pymongo/son\u manipulator.py”,第73行,在transform\u文件中
子[“_id”]=ObjectId()
TypeError:“str”对象不支持项分配

我在这里只是猜测,因为您没有给我们回溯或足够的信息来重现您的问题,但我怀疑是这样的:

activity = ast.literal_eval(json.dumps(value))  
您将获取
value
,这可能是某种Python对象,调用
json.dumps
将其转换为表示该对象的json字符串,然后调用
ast.literal\u eval
将其转换回原始对象。那不可能有用


同时,错误似乎是说,当字符串需要其他类型的对象(最有可能是列表或其他可变序列)时,您有一个字符串。如果
value
已经是一个JSON字符串,则需要使用
JSON.loads
从中获取Python对象。如果它本身是Python文本字符串,那么您希望在该字符串上使用
ast.literal\u eval
,而不是在表示原始字符串的JSON字符串上。如果是其他的东西,我们需要知道其他的东西,知道如何解码。我唯一能确定的是,你的代码对任何事情都没有用处。

你为什么要使用
ast.literal\u eval(json.dumps(value))
?如果它恰好适合JSON表示为有效Python的(大)数据子集,那么它将返回
value
,并在任何其他情况下引发异常。您实际上想在那里做什么?您已经在检索JSON了,为什么要再次转储到JSON,然后将其解释为Python文本?您的代码没有什么意义。我编辑了上面的代码以反映我的第一次尝试,其中不包括ast.literal\u eval或json.dumps(value)。我还包括从数据库中获取的字符串示例。您是否可以打印所获取内容的
repr
和/或
类型,而不是内容本身?我不知道这是一个
dict
,还是一个
str
…无论如何,我怀疑你得到的是一个
dict
的JSON字符串表示,而
psa.insert
想要的是一个
dict
,所以,正如我的回答所说,你想要使用
JSON.loads
。(知道它是JSON字符串的唯一方法是知道它是如何生成的,我看不出来,但希望您知道。)
value
是SQL结果行中的一列。SQL只检索一列,
activity\u json
,因此这里大概没有内部循环就可以了。如果它已经是JSON,则不需要转换步骤。@MartijnPieters:没错,但内部循环在这里并没有造成任何影响,只是使代码变得比需要的更复杂。当事情已经如此混乱的时候,我认为最好先弄清楚他到底在处理什么,他试图用它来做什么,解决这个问题,然后再解释使之更简单的方法。