在Nodejs中将JSON转换为Thrift对象

时间:2014-01-28 20:44:16

标签: javascript json node.js thrift

我有以下的thrift文件:

union D{ 1: string s; }

struct B{ 1: required D d; }

struct C{ 1: required D d; }

union A{ 1: B b; 2: C c; }

service Test { void store(1: A a) }

我有以下JSON对象,它是通过解析字符串获得的。

var data_json = {
    'b': {
        'd': {
            's': "hello"
        }
    }
};

我正在尝试在Nodejs中编写一个thrift客户端,它以store为参数调用data_json方法,但是当我这样做时出现以下错误:

/home/aakash/Documents/thrift0/gen-nodejs/test_types.js:225
    this.b.write(output);
           ^
TypeError: Object #<Object> has no method 'write'
    at Object.A.write (/home/aakash/Documents/thrift0/gen-nodejs/test_types.js:225:12)
    at Object.Test_store_args.write (/home/aakash/Documents/thrift0/gen-nodejs/Test.js:57:12)
    at Object.TestClient.send_store (/home/aakash/Documents/thrift0/gen-nodejs/Test.js:113:8)
    at Object.TestClient.store (/home/aakash/Documents/thrift0/gen-nodejs/Test.js:105:8)
    at Object.<anonymous> (/home/aakash/Documents/thrift0/client.js:40:8)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

但是,当我将以下对象作为参数传递时,它可以正常工作:

var data_thrift = new ttypes.A({
    'b': new ttypes.B({
        'd': new ttypes.D({
            's': "hello"
        })
    })
});

有没有办法将data_json直接传递给store,或者将data_json转换为data_thrift

1 个答案:

答案 0 :(得分:0)

  

我试图在Nodejs中编写一个调用商店的thrift客户端   使用data_json作为参数的方法,但是我收到以下错误   当我这样做时:

/home/aakash/Documents/thrift0/gen-nodejs/test_types.js:225
this.b.write(output);
  

有没有办法将data_json直接传递给store,或者某种方式   将data_json转换为data_thrift

TL; DR

不确定。只为每个Object提供一个write()方法,实现Thrift生成的内容,或者为数据提供另一种序列化机制来生成完全相同的输出。

说明

Thrift和Thrift库生成的代码为使用Thrift提供了必要的基础结构,并确保了Thrift RPC调用和序列化数据的互操作性。为实现此目的,序列化数据遵循某种预定义结构,该结构由您使用的协议决定。 RPC和序列化框架的所有基础结构(包括数据的生成代码)都可以提供实现此目的的方法。

如果您的应用程序在内部以其他方式保存数据(这是完全正常的),您将不得不来回转换它们。直接存储数据的唯一方法是生成Thrift基础架构为您的数据生成的精确相同的JSON输出,否则另一方将无法反序列化您的JSON。

但从技术上讲,按照这条路径,你最终会重新发明轮子。