Thrift -从简单的JSON转换

juzqafwq  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(220)

我创建了以下Thrift对象:

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)

我错过什么了吗?

iqjalb3h

iqjalb3h1#

您忽略了一个事实,即Thrift的JSON与您的不同。字段名称没有写入,而是写入了分配的字段ID号(预期)。以下是Thrift的JSON协议的示例:

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

换句话说,Thrift并不打算解析任何类型的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不太常用。

" 所以你的意思是,我们只需要一种方法来告诉Thrift JSON是如何组织的?"**

不,因为Thrift背后的目的和想法是有一个框架来反序列化/序列化事物和/或尽可能有效地实现RPC服务器和客户端。它不打算有一个通用的文件解析器。相反,Thrift只读取和说出自己的一组格式,即plugged into the architecture as protocols:Thrift Binary、Thrift JSON、Thrift Compact等等。

**你能做什么:**除了我在回答的第一部分提到的,你可以考虑编写你自己的自定义Thrift协议实现来支持你选择的特定JSON格式。这并不难,值得一试。

相关问题