-2

如何将从 psycopg2 查询返回的有效 json 字符串转换为可以通过 pymongo 插入到 mongo 实例的 json?我尝试了很多事情,但都没有成功。我在插入 mongo 时不断收到 TypeError TypeError: 'str' object does not support item assignment

顺便说一下,我正在使用 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
4

1 回答 1

1

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

activity = ast.literal_eval(json.dumps(value))  

您正在使用value,这可能是某种 Python 对象,调用json.dumps将其转换为表示该对象的 JSON 字符串,然后调用ast.literal_eval将其转换回原始对象。那不可能有用。

同时,错误似乎是说当它期待某种其他类型的对象(很可能是列表或其他可变序列)时,您有一个字符串。如果value已经是一个 JSON 字符串,你想用它json.loads来获取一个 Python 对象。如果它是 Python 文字字符串本身,则要ast.literal_eval在字符串上使用,而不是在表示原始字符串的 JSON 字符串上使用。如果是其他东西……好吧,我们需要知道其他东西才能知道如何对其进行解码。我唯一可以确定的是,没有什么可以想象的事情可以使您的代码有用。

于 2013-10-23T23:40:07.297 回答