【问题标题】:Convert JSON to Thrift Object in Nodejs在 Nodejs 中将 JSON 转换为 Thrift 对象
【发布时间】:2014-01-29 06:08:16
【问题描述】:

我有以下 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 中编写一个节俭客户端,它以 data_json 作为参数调用 store 方法,但是这样做时出现以下错误:

/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 的方法?

【问题讨论】:

    标签: javascript json node.js thrift


    【解决方案1】:

    我正在尝试在 Nodejs 中编写一个调用商店的节俭客户端 以 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

    当然。只需为您的每个Objects 提供一个 write() 方法,该方法实现 Thrift 生成的内容,或者为您的数据提供替代序列化机制以产生完全相同的输出。

    说明

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

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

    但从技术上讲,沿着这条路走下去,你最终会重新发明轮子。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 2016-08-03
    • 2014-03-03
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2017-06-16
    • 2021-09-20
    相关资源
    最近更新 更多