python用json.load替换json.dump时大小有什么不同 背景:
我正在使用python sdk向couchbase插入一些数据 当我尝试使用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
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_转换器
只接受一对编码器和解码器函数(因此基本上需要同时设置它们,即使您只想替换其中一个)
要解决您真正的问题:
正如原始文章()中提到的,正确的解决方案是确保您的输入(或在本例中,其组成键/值)为:
str
对象unicode
对象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”)
。