python用json.load替换json.dump时的大小有什么不同

时间:2015-02-22 17:02:08

标签: python json couchbase

背景

我正在使用python sdk向couchbase插入一些数据。

当我尝试使用set方法插入数据时:

connection = set(key, document)

我得到了异常状态,数据是unicoded并且不是ascii。我用这个解决了这个问题:

couchbase.set_json_converters(json.dumps, json.loads)

我的问题:

该解决方案会影响插入到couchbase的数据大小吗?

另外,你能给我一些关于joson.dumps和json.loads的不同解释。我试图通过互联网搜索,我发现json.dump用于编码,而json.loads用于解码,但我不明白

评论后

我这样做了:

print "First Approach is using JSON loads instead of JSON dumps"
import json
import sys
d = "roma"
sizeBefore = sys.getsizeof(d)
print "size of d  = {0}".format(sizeBefore)

dumped = json.dumps(d)
sizeAfter = sys.getsizeof(dumped)
print "size with json.dumps = {0}".format(sizeAfter)

loads = json.loads(dumped)
sizeLoad = sys.getsizeof(loads)
print "size with json.loads = {0}".format(sizeLoad)

print "-------------------------"
print "Second approach is decoding the string as UTF-8"
sizeBeforeDecode = sys.getsizeof(d)
print "Size before applying decode = {0}".format(sizeBeforeDecode)

d=d.decode("utf-8")
sizeAfterDecode = sys.getsizeof(d)
print "Size after applying decode = {0}".format(sizeAfterDecode)

结果是:

First Approach is using JSON loads instead of JSON dumps
size of d  = 37
size with json.dumps = 39
size with json.loads = 58
-------------------------
Second approach is decoding the string as UTF-8
Size before applying decode = 37
Size after applying decode = 58

这意味着什么?

1 个答案:

答案 0 :(得分:0)

要回答标题问题,这就像将苹果与橙子进行比较一样。 json.dumps将Python对象转换为JSON表示,json.loads将JSON表示转换为Python对象。 set_json_converters只接受编码器和解码器功能的(所以你基本上需要同时设置它们,即使你只想替换其中一个)。 / p>

解决真正的问题:

正如此处的原始帖子(couchbase python sdk ascii exception)中所述,正确的解决方案是确保您的输入(或者在这种情况下,其组成键/值)是:

  1. 7位ASCII Python str对象
  2. Python unicode个对象
  3. 理想情况下,您应该确保您打算将其视为" Text" (即非 - '二进制'数据,或您打算编码为非 - '二进制格式(如JSON)的数据)应转换为unicode对象作为尽早。不幸的是,在Python2中(见下文),很容易意外混淆两者 - 通常导致在处理链中发现问题而不是早期发现问题。

    set_json_converters"解决方案"仅仅是一个黑客,以便您的代码可以工作(次优),直到它实际修复。要解决此问题,您需要正确清理并规范化输入。目前您的输入是一个字典,其中包含" byte" Unicode的值。是的,中的特定值可能被解释为有效的UTF-8序列,但Python并不关心这一点,因此函数期望有效的" Unicode"输入将失败。

    强烈建议您阅读http://nedbatchelder.com/text/unipain.html,了解Python中Unicode处理的非常全面,实用和正确的解释。