10

MongoDB JSON ドキュメントを BSON json_utilで逆シリアル化できないようです。

json.loads 関数がObjectId()文字列を詰まらせています。json_util が MongoDB の ObjectId 形式を処理し、使用可能な JSON に変換できることは理解していました。

Python コード:

import json    
from bson import json_util

s = "{u'_id': ObjectId('4ed559abf047050c58000000')}"
u = json.loads(s, object_hook=json_util.object_hook)

デコーダ例外が発生します:

...
    u = json.loads(s, object_hook=json_util.object_hook)
  File "\python27\lib\json\__init__.py", line 339, in loads
    return cls(encoding=encoding, **kw).decode(s)
  File "\python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "\python27\lib\json\decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 1 (char 1)

何か不足していますか?

4

2 に答える 2

20

あなたの文字列形式は実際にはpython表現のように見えると思います...

s = '{"_id": {"$oid": "4edebd262ae5e93b41000000"}}'
u = json.loads(s, object_hook=json_util.object_hook)

print u  # Result:  {u'_id': ObjectId('4edebd262ae5e93b41000000')}

s = json.dumps(u, default=json_util.default)

print s  # Result:  {"_id": {"$oid": "4edebd262ae5e93b41000000"}}

bson.json_util.object_hook 関数には、実際の json 文字列表現に ObjectId() があるための処理のタイプがないようです。

于 2011-12-07T02:04:23.963 に答える
4

ここには 2 つの問題があります。

  1. JSON デコードしようとしている文字列は JSON ではなく、Python 辞書の文字列表現です。特に問題はu'_id'、有効な JSON キーではないことです (JSON キーは引用符で囲まれた文字列です。ここでの「u」は、JSON では意味のない Python Unicode 文字列を示します)。

  2. json_util.object_hookObjectIdJSONでは使用できません。jsonモジュールは JSON をデコードし、デコードobject_hookされた各オブジェクトでコールバックを呼び出します。MongoDB 拡張 JSONjson_util.object_hookの厳密モードで定義されている特定のパターンを探します。

を適切に使用する方法の例については、@jdi の回答を参照してくださいjson_util

于 2011-12-07T02:06:45.557 に答える