2013-11-28 4 views
3

Я создал следующий бережливости объект:Бережливость - преобразование из простого JSON

struct Student{ 
     1: string id; 
     2: string firstName; 
     3: string lastName 
} 

Теперь я хотел бы прочитать этот объект из JSON. В соответствии с этим post это возможно

Так что я написал следующий код:

String json = "{\"id\":\"aaa\",\"firstName\":\"Danny\",\"lastName\":\"Lesnik\"}"; 
    StudentThriftObject s = new StudentThriftObject(); 
    byte[] jsonAsByte = json.getBytes("UTF-8"); 
    TMemoryBuffer memBuffer = new TMemoryBuffer(jsonAsByte.length); 
    memBuffer.write(jsonAsByte); 

    TProtocol proto = new TJSONProtocol(memBuffer); 
    s.read(proto); 

Что я получаю следующее исключение:

Exception in thread "main" org.apache.thrift.protocol.TProtocolException: Unexpected character:i 
    at org.apache.thrift.protocol.TJSONProtocol.readJSONSyntaxChar(TJSONProtocol.java:322) 
    at org.apache.thrift.protocol.TJSONProtocol.readJSONInteger(TJSONProtocol.java:698) 
    at org.apache.thrift.protocol.TJSONProtocol.readFieldBegin(TJSONProtocol.java:837) 
    at com.vanilla.thrift.example.entities.StudentThriftObject$StudentThriftObjectStandardScheme.read(StudentThriftObject.java:486) 
    at com.vanilla.thrift.example.entities.StudentThriftObject$StudentThriftObjectStandardScheme.read(StudentThriftObject.java:479) 
    at com.vanilla.thrift.example.entities.StudentThriftObject.read(StudentThriftObject.java:413) 
    at com.vanilla.thrift.controller.Main.main(Main.java:24) 

ли я что-то отсутствует?

+0

Сначала просто проанализируйте свой JSON в Картах и ​​списках, затем свалите это и поймите. Затем выясните, как извлечь нужные данные. –

+0

Прошу прощения, но у меня нет гей. Какой json я должен разбирать. У меня очень простая структура бережливости, нет необходимости в Картах и ​​списках. –

+1

Проблема в том, что вы используете инструменты, которые сложнее, чем вам нужно (и понимаете). Начните просто. –

ответ

5

Вам не хватает того, что JSON Thrift отличается от вашего. Имена полей не записываются, вместо этого назначенные идентификационные номера полей записываются (и ожидаются). Вот пример для протокола JSON бережливости в:

[1,"MyService",2,1,{"1":{"rec":{"1":{"str":"Error: Process() failed"}}}}] 

Других словах, бережливость не предназначена для разбора любого вида JSON. Он поддерживает очень специфический формат JSON как один из возможных транспортов.

Однако, в зависимости от источника данных JSON, Thrift может по-прежнему помочь вам, если вы можете использовать его с обеих сторон. В этом случае напишите IDL, чтобы описать структуры данных, передать их компилятору Thrift и интегрировать как сгенерированный код, так и необходимые части библиотеки с вашими проектами.

Если источник JSON находится за пределами вашей досягаемости или если формат JSON по какой-либо причине не может быть изменен, вам нужно найти другой способ.

Формат и семантика разные звери

В какой-то степени, весь вопрос можно сравнить с XML: Существует один общий синтаксис XML, который говорит нам о том, как мы должны появляются две вещи, чтобы любой стандартный совместимой XML процессор может их прочитать.

Но знание правил XML является лишь половиной ответа, если мы получим некоторый XML-файл от кого-то. Даже если наш синтаксический анализатор XML может прочитать файл успешно, потому что он хорошо сформированный XML, нам нужно знать семантику данных, чтобы действительно использовать то, что находится внутри этого файла: Это customer data record? Или это SOAP envelope? Может быть, configuration file?

Это то, где DTD или XML Schema входят в игру, они существуют для описания содержимого данных XML. Не зная логической структуры, вы теряетесь, потому что есть множество возможных способов выразить вещи в XML. И точно так же верно с JSON, за исключением того, что JSON schema descriptions реже используются.

«Так значит, нам нужно всего лишь способ сказать бережливость, как организована в формате JSON?»

Нет, потому что цель и идея бережливости должна иметь основу для De/Serialize вещи и/или внедрять RPC-серверы и клиенты как можно более эффективно. Он не предназначен для анализатора файлов общего назначения. Вместо этого Thrift читает и говорит только о своем собственном наборе форматов: plugged into the architecture as protocols: Thrift Binary, Thrift JSON, Thrift Compact и еще несколько.

Что вы могли бы сделать: В дополнение к тому, что я сказал в первом разделе моего ответа, вы можете рассмотреть возможность написания собственной пользовательской реализации протокола Thrift для поддержки вашего конкретного формата JSON. Это не так сложно, и стоит попробовать.

+0

Похоже, что твиттер сериализует json, используя тот же подход: https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/io/ThriftCodec.java. Единственное различие заключается в том, что они используют бережливость 0.5.0, и я использую 0.9.0. Я попытаюсь создать двоичные файлы и запустить мой код в этой версии. У меня такое ощущение, что с момента выпуска релиза было изменено. –

+0

@ danny.lesnik: Вы прочитали комментарий прямо сверху? В нем говорится: «* Кодек, который может кодировать и декодировать триплетные структуры *» - он не говорит «* Кодек, который может кодировать и декодировать любую структуру JSON *». – JensG

Смежные вопросы