我正在使用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
这意味着什么?
答案 0 :(得分:0)
要回答标题问题,这就像将苹果与橙子进行比较一样。 json.dumps
将Python对象转换为JSON表示,json.loads
将JSON表示转换为Python对象。 set_json_converters
只接受编码器和解码器功能的对(所以你基本上需要同时设置它们,即使你只想替换其中一个)。 / p>
解决真正的问题:
正如此处的原始帖子(couchbase python sdk ascii exception)中所述,正确的解决方案是确保您的输入(或者在这种情况下,其组成键/值)是:
str
对象unicode
个对象 理想情况下,您应该确保您打算将其视为" Text" (即非 - '二进制'数据,或您打算编码为非 - '二进制格式(如JSON)的数据)应转换为unicode
对象作为尽早。不幸的是,在Python2中(见下文),很容易意外混淆两者 - 通常导致在处理链中发现问题而不是早期发现问题。
set_json_converters
"解决方案"仅仅是一个黑客,以便您的代码可以工作(次优),直到它实际修复。要解决此问题,您需要正确清理并规范化输入。目前您的输入是一个字典,其中包含" byte" 不 Unicode的值。是的,中的特定值可能被解释为有效的UTF-8序列,但Python并不关心这一点,因此函数期望有效的" Unicode"输入将失败。
我强烈建议您阅读http://nedbatchelder.com/text/unipain.html,了解Python中Unicode处理的非常全面,实用和正确的解释。