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

python用json.load替换json.dump时大小有什么不同 背景:,python,json,couchbase,Python,Json,Couchbase,我正在使用python sdk向couchbase插入一些数据 当我尝试使用set方法插入数据时,如下所示: connection = set(key, document) 我得到的异常状态是数据是Unicode的,而不是ascii。我用以下方法解决了这个问题: couchbase.set_json_converters(json.dumps, json.loads) 我的问题: 该解决方案会影响插入couchbase的数据的大小吗 另外,你能给我解释一下joson.dumps和json.l

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

当我尝试使用
set
方法插入数据时,如下所示:

connection = set(key, document)
我得到的异常状态是数据是Unicode的,而不是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

请问这是什么意思?

回答标题问题,这就像把苹果和桔子比较一样
json.dumps
将Python对象转换为json表示,而
json.loads
将json表示转换为Python对象。
set_json_转换器
只接受一对编码器和解码器函数(因此基本上需要同时设置它们,即使您只想替换其中一个)

要解决您真正的问题:

正如原始文章()中提到的,正确的解决方案是确保您的输入(或在本例中,其组成键/值)为:

  • 7位ASCII Python
    str
    对象
  • Python
    unicode
    对象
  • 理想情况下,您应该确保您打算作为“文本”处理的任何数据(即非“二进制”数据,或您打算编码为非“二进制”格式(如JSON)的数据)应尽早转换为
    unicode
    对象。不幸的是,在Python2(见下文)中,很容易意外地将二者混淆——通常导致在处理链的深处发现问题,而不是在早期发现问题

    set\u json\u转换器
    的“解决方案”只是一个小技巧,让你的代码可以工作(次优),直到它被实际修复为止。要修复它,您需要正确地清理和规范您的输入。目前,您的输入是一个字典,它的“字节”值不是Unicode。是的,可以将中的特定值解释为有效的UTF-8序列,但Python并不关心这一点,因此期望有效的“Unicode”输入的函数将失败


    我强烈建议您阅读Python中有关Unicode处理的非常全面、实用和正确的解释。

    dumps将从您的dict中创建一个有效的json字符串,load基本上将该字符串作为dict。我不太担心其大小
    dumped=dumps(d)
    将dict放入shell中,然后使用
    加载(dumped)
    ,您将看到difference@PadraicCunningham我会尽量利用你的分析。但是你的意思是:
    d=[(键1,值1),(键2,值2)]转储=转储(d)
    ?我怎样才能注意到差异呢?是的,如果要检查大小,请使用sys.getsizeof before和after@PadraicCunningham我会尝试一下,然后再回来告诉你。你也可以在创建字符串时将其设置为unicode,
    s=“foo”。decode(“utf-8”)