2013-03-18 18 views
3

我可能会对某些东西感到困惑,但是当我从Java Riak客户端存储自定义对象,然后尝试使用Python Riak客户端读取该对象时,最终得到的是原始json字符串而不是字典。当由riak-python-client读取时,由riak-java-client存储的对象最终成为原始json?

但是,如果我将对象存储在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) 

上述蟒的结果是:

<type 'str'> 

我期待这是<type 'dict'>,就像这里的例子是如何工作的: http://basho.github.com/riak-python-client/tutorial.html#getting-single-values-out

我困惑,为什么当对象从Java存储它被存储为一个JSON字符串,而不是作为一个对象。

如果有人能指出我的方法可能导致这种差异,我将不胜感激。

谢谢!

+1

如果您检索并比较通过Python和Java客户端创建的两个对象,那么元数据是否存在差异内容类型? – 2013-03-19 11:44:59

+0

正如在下面的答案中指出的那样,是的,Content-type与Python客户端生成“application/json”,而Java客户端生成“application/json; charset = UTF-8”之间存在差异。根据回答和github上报告的问题,这就是问题所在。点建议。 – chaimp 2013-03-19 17:36:17

回答

3

看来您已经在我们的Python客户端发现了一个HTTP协议/传输错误。

您使用的版本和主版本中的当前版本都无法正确解码JSON。我和其他开发人员看着这个早上,它似乎从一个问题阻止与基督教在他的评论中注意到了Riak返回charset参数与内容类型("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

+0

啊哈!我注意到了Content-Type头文件中的charset = utf8,当我试图在昨晚想到这个时候。我认为这不可能,但我想是的。当我认为我做错了时,再次感谢您验证我的方法。我将尝试使用PbcTransport。 – chaimp 2013-03-19 16:47:07

+0

感谢您发现错误:-D – 2013-03-19 16:52:41

相关问题