我可能会对某些事情感到困惑,但是当我从Java Riak客户端存储自定义对象然后尝试使用Python Riak客户端读取该对象时,我最终得到一个原始json字符串而不是dict。
但是,如果我将对象存储在python中,我可以在获取该对象时输出python字典。
我可以只是在python端使用一个json库来解决这个问题,但事实上我遇到这种差异会让我觉得我做错了。
在Java方面,这是我的对象:
class DocObject
{
public String status; // FEEDING | PERSISTED | FAILED | DELETING
public List<String> messages = new ArrayList<String>();
}
class PdfObject extends DocObject
{
public String url;
public String base_url;
}
这就是我在Riak中存储该对象的方式:
public void feeding(IDocument doc) throws RiakRetryFailedException {
PdfObject pdfObject = new PdfObject();
pdfObject.url = doc.getElement("url").getValue().toString();
pdfObject.base_url = doc.getElement("base_url").getValue().toString();
pdfObject.status = "FEEDING";
String key = hash(pdfObject.url);
pdfBucket.store(key, pdfObject).execute();
}
这就是我在Python中用来获取数据的内容:
# Connect to Riak.
client = riak.RiakClient()
# Choose the bucket to store data in.
bucket = client.bucket('pdfBucket')
doc = bucket.get('7909aa2f84c9e0fded7d1c7bb2526f54')
doc_data = doc.get_data()
print type(doc_data)
以上python的结果是:
<type 'str'>
我希望它是<type 'dict'>
,就像这里的示例如何工作:
http://basho.github.com/riak-python-client/tutorial.html#getting-single-values-out
我很困惑为什么当从Java存储对象时,它存储为JSON字符串而不是对象。
如果有人能指出我的方法可能导致这种差异的问题,我将不胜感激。
谢谢!
答案 0 :(得分:3)
看来你在我的Python客户端中发现了一个带有HTTP协议/传输的错误。
您正在使用的版本和master中的当前版本都没有正确解码JSON。我自己和另一个开发人员今天早上调查了这个问题似乎源于一个问题,来自Riak的charset
参数与内容类型一样,正如Christian在评论中所指出的那样("application/json; charset=UTF-8"
)
我们在github(https://github.com/basho/riak-python-client/issues/227)上打开了一个问题,并且会更正此问题。
与此同时,我唯一的建议是自己解码返回的JSON字符串,或使用1.5.2客户端(pypy的最新稳定版)和Protocol Buffers传输:
client = riak.RiakClient(port=8087, transport_class=riak.RiakPbcTransport)
它会将解码后的JSON作为dict
返回,正如您所期望的那样。