3

我可能对某些事情感到困惑,但是当我从 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 字符串而不是对象。

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

谢谢!

4

1 回答 1

3

您似乎在我们的 Python 客户端中发现了一个带有 HTTP 协议/传输的错误。

您使用的版本和 master 中的当前版本都没有正确解码 JSON。我自己和另一位开发人员今天早上对此进行了调查,这似乎源于charset从 Riak 返回参数的问题,其内容类型为 Christian 在他的评论 ( "application/json; charset=UTF-8")中指出的内容类型

我们在 github ( https://github.com/basho/riak-python-client/issues/227 ) 上打开了一个问题,并将得到纠正。

同时,我唯一的建议是自己解码返回的 JSON 字符串,或者使用 1.5.2 客户端(pypy 的最新稳定版)和协议缓冲区传输:

client = riak.RiakClient(port=8087, transport_class=riak.RiakPbcTransport)

它将dict按照您的预期返回解码后的 JSON。

于 2013-03-19T15:08:42.733 回答