【问题标题】:difference between json.loads and python eval to trans string to json objectjson.loads 和 python eval 将字符串转换为 json 对象的区别
【发布时间】:2016-01-14 17:04:01
【问题描述】:

我使用redis将所有数据存储在我的小型网络应用程序中,格式为python dict或json对象。

所以我将它们作为纯字符串存储在 redis 中,并希望获取它们并将它们转换为 dict/json 对象以供以后使用。

但我发现我可以使用 python eval 将该字符串转换为 dict,但不能使用 json.loads()。

从下面的代码看,似乎是因为从redis读取的字符串格式不能喂json,所以可以使用json.loads(json.dumps(data_in_redis))进行转换。

这是我的担忧和问题

  • 我可以在python中使用eval来序列化字符串吗
  • 如果eval不是一个明智的选择,有没有其他方法可以将这种格式的字符串序列化为json
  • 如果我是json粉丝[是的,我是],我可以使用json.loads(json.dumps(data_in_redis))吗,这是否会浪费一些时间,因为它需要先转储数据。

非常感谢

In [6]: data_in_redis = r.hmget('dash_meta', '8')[0]

In [7]: data_in_redis
Out[7]: "{'id': 8, 'author': 'author-author', 'name': 'name-name', 'time_modified': 1444958866, 'desc': 'desc'}"

In [8]: eval(data_in_redis)
Out[8]:
{'author': 'author-author',
 'desc': 'desc',
 'id': 8,
 'name': 'name-name',
 'time_modified': 1444958866}

In [10]: import json

In [11]: json.loads(data_in_redis)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-3f228e0cf408> in <module>()
----> 1 json.loads(data_in_redis)

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    336             parse_int is None and parse_float is None and
    337             parse_constant is None and object_pairs_hook is None and not kw):
--> 338         return _default_decoder.decode(s)
    339     if cls is None:
    340         cls = JSONDecoder

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
    364
    365         """
--> 366         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    367         end = _w(s, end).end()
    368         if end != len(s):

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.pyc in raw_decode(self, s, idx)
    380         """
    381         try:
--> 382             obj, end = self.scan_once(s, idx)
    383         except StopIteration:
    384             raise ValueError("No JSON object could be decoded")

ValueError: Expecting property name: line 1 column 2 (char 1)

In [12]: json.dumps(data_in_redis)
Out[12]: '"{\'id\': 8, \'author\': \'author-author\', \'name\': \'name-name\', \'time_modified\': 1444958866, \'desc\': \'desc\'}"'

In [13]: json.loads(_)
Out[13]: u"{'id': 8, 'author': 'author-author', 'name': 'name-name', 'time_modified': 1444958866, 'desc': 'desc'}"

In [14]:

【问题讨论】:

    标签: python json serialization


    【解决方案1】:

    有很多事情你应该知道:

    • 您的数据库包含无效的 json。您应该找到写入它的代码,并确保它使用json.dumps
    • 在数据本身包含引号或撇号的情况下,盲目地以文本替换引号不起作用
    • eval 不应该在这里使用。如果需要处理格式错误的数据,请使用ast.literal_eval

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2019-08-27
      • 2020-05-27
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      相关资源
      最近更新 更多