Объекты, хранящиеся в riak-java-client, становятся необработанными json при чтении riak-python-client?

Меня что-то смущает, но когда я сохраняю пользовательский объект из клиента Java Riak, а затем пытаюсь прочитать этот объект с помощью клиента Python Riak, я получаю необработанную строку json вместо dict.

Однако, если я сохраняю объект в python, я могу вывести словарь python при извлечении этого объекта.

Я мог бы просто использовать библиотеку json на стороне python, чтобы решить эту проблему, но сам факт, что я сталкиваюсь с этим несоответствием, заставляет меня думать, что я делаю что-то не так.

На стороне 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, а не как объект.

Я был бы признателен, если бы кто-нибудь мог указать на проблему с моим подходом, которая может вызывать это несоответствие.

Спасибо!


person chaimp    schedule 18.03.2013    source источник
comment
Если вы извлекаете и сравниваете два объекта, созданных с помощью клиентов Python и Java, есть ли какие-либо различия в метаданных, например. Тип содержимого?   -  person Christian Dahlqvist    schedule 19.03.2013
comment
Как отмечено в ответе ниже, да, была разница между Content-type, где клиент python создавал application/json, тогда как клиент Java создавал application/json; кодировка=UTF-8. Согласно ответу и проблеме, о которой сообщается на github, это проблема. Место по предложению.   -  person chaimp    schedule 19.03.2013


Ответы (1)


Похоже, вы нашли ошибку в нашем клиенте Python с протоколом/транспортом HTTP.

И версия, которую вы используете, и текущая версия в мастере неправильно декодируют JSON. Я и еще один разработчик рассмотрели это сегодня утром, и, похоже, это связано с проблемой с параметром charset, возвращаемым из Riak с типом контента, как отметил Кристиан в своем комментарии ("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)

он вернет декодированный JSON как dict, как вы ожидаете.

person Brian Roach    schedule 19.03.2013
comment
Ага! Я заметил, что charset=utf8 в заголовке Content-Type, когда пытался понять это прошлой ночью. Я полагал, что этого не может быть, но я предполагаю, что это было. Спасибо (еще раз) за проверку моего подхода, когда я думал, что делаю это неправильно. Я собираюсь попробовать использовать PbcTransport. - person chaimp; 19.03.2013