0

我有一个从 phpmyadmin 导出的 json 文件,它看起来像这样(utf-8 文件):

[{"user_email": "bh549@sina.cn","followee_id": 1411833182,"create_date": "cdatetime datetime p1 (S\'\\x07\\xdb\\x06\\x13\\x16\\x08(\\r\\xd5\\xcc\' tRp2 ."}, {"user_email": "zaici4@sina.cn","followee_id": 1296426000,"create_date": "cdatetime datetime p1 (S\'\\x07\\xdb\\x07\\x14\\x179\\x16\\x02 \\x08\' tRp2 ."}, {"user_email": "yanaa357@sina.com","followee_id": 1848085255,"create_date": "cdatetime datetime p1 (S\'\\x07\\xdb\\x08\\x13\\x17\\x10\\x0f\\x05\\x1c\\x02\' tRp2 ."}]

每个 dict 是数据库中的一行,每行中的第三个值是一个 cpickled 字符串。

然后我使用表单将此文件上传到 python 脚本(使用 post 方法)。

然后在 python 脚本中解析这个文件,如下所示:

   import cgi, os
    import cgitb; cgitb.enable()
    import json
    #import simplejson as json
    print "Content-type: text/html\n\n"
    try:
        import msvcrt
        msvcrt.setmode (0, os.O_BINARY) # stdin = 0
        msvcrt.setmode (1, os.O_BINARY) # stdout = 1
    except ImportError:
        pass

    form = cgi.FieldStorage()

    file_content = form['mysql_table'].value
    file_content = json.loads(file_content)

然后浏览器在执行 json.loads 时打印一个值错误:

<type 'exceptions.ValueError'>: Invalid control character at: line 1 column 83 (char 83)

char 83 是第一行第三个值中的空格。

如何解决这个问题?

不管怎样,谢谢mhawke。但是你说的第一个问题不存在。没有 \n 因为我从打印结果中复制了它,在我导出的 json 文件中,它实际上有 \n

{"user_email": "bh549@sina.cn","followee_id": 1411833182,"create_date": "cdatetime
datetime
p1
(S\'\\x07\\xdb\\x06\\x13\\x16\\x08(\\r\\xd5\\xcc\'
tRp2
."}, {"user_email": "zaici4@sina.cn","followee_id": 1296426000,"create_date": "cdatetime
datetime
p1
(S\'\\x07\\xdb\\x07\\x14\\x179\\x16\\x02 \\x08\'
tRp2
."}

我是不是误会了?第二个问题,是phpmyadmin在导出时转义了文件,那你说的问题怎么解决?

slouton:我正在编写一个 python 脚本来导出表并转换腌制数据。它现在工作了,现在似乎是用腌制数据处理 json 的方法。

4

3 回答 3

1

换行符在 JSON 中的字符串中无效,如果 phpMyAdmin 正在生成它们,那么您应该在项目中记录一个错误。

>>> json.loads('"123"')
u'123'
>>> json.loads('"123\n456"')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 4 (char 4)
于 2012-06-15T03:41:24.807 回答
0

JSON 不支持像\x07. 您必须改用 unicode 转义符 ( \u0007)。在解码之前尝试将一种形式转换为另一种形式:

content = content.replace('\\x', '\\u00')
于 2012-06-12T07:37:32.483 回答
0

有几个问题。

首先是泡菜似乎无效(我认为)。它在各个组件之间缺少换行符。例如

import cPickle
bad_pickle = "cdatetime datetime p1 (S\'\\x07\\xdb\\x06\\x13\\x16\\x08(\\r\\xd5\\xcc\' tRp2 ."
good_pickle = '\n'.join(bad_pickle.split())

>>> cPickle.loads(bad_pickle)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cPickle.UnpicklingError: pickle data was truncated

>>> cPickle.loads(good_pickle)
datetime.datetime(2011, 6, 19, 22, 8, 40, 906700)

第二个问题是你需要\用另一个\. 您可以使用 轻松做到这一点replace,例如replace('\\', '\\\\')

此代码显示往返 JSON 编码和解码,包括腌制对象:

import json, cPickle
from datetime import datetime

pickled_datetime = cPickle.dumps(datetime.now())
d = {"user_email": "bh549@sina.cn",
     "followee_id": 1411833182,
     "create_date": pickled_datetime }
j = json.dumps(d)

>>> d
{'create_date': "cdatetime\ndatetime\np1\n(S'\\x07\\xdc\\x06\\r\\x0c\\x16:\\x06/\\x85'\ntRp2\n.", 'followee_id': 1411833182, 'user_email': 'bh549@sina.cn'}
>>> j
'{"create_date": "cdatetime\\ndatetime\\np1\\n(S\'\\\\x07\\\\xdc\\\\x06\\\\r\\\\x0c\\\\x16:\\\\x06/\\\\x85\'\\ntRp2\\n.", "followee_id": 1411833182, "user_email": "bh549@sina.cn"}'

注意反斜杠是如何j被一个额外的反斜杠转义的。这就是来自数据库的泡菜的样子。解码存储的 JSON 数据j如下:

d2 = json.loads(j)
cPickle.loads(d2['create_date'])

>>> d2
{'followee_id': 1411833182, 'create_date': "cdatetime\ndatetime\np1\n(S'\\x07\\xdc\\x06\\r\\x0c\\x16:\\x06/\\x85'\ntRp2\n.", 'user_email': 'bh549@sina.cn'}
>>> cPickle.loads(d2['create_date'])
datetime.datetime(2012, 6, 13, 12, 22, 58, 405381)
于 2012-06-13T03:31:18.790 回答