Javascript 对象 encoding/decoding 将消息传递给 API

Javascript object encoding/decoding when passing a message to an API

我正在将消息传递给第三方消息队列,该消息队列将消息中继到我的队列侦听器(全部在 node.js 服务器端)。该消息具有预定义格式,允许我定义 "custom properties"。当我提供基本类型(字符串、数字等)时这很好用,但是当我尝试在自定义属性中传递一个对象时,它失败了。

发送此消息:

var info = {foo: 100};
var message = {
    body: 'some string',
    customProperties: {
        type: 1,
        name: 'test',
        info: info
    }
};

Returns 此消息:

{
    body: 'some string',
    customProperties: {
        type: 1,
        name: 'test',
        info: '[object Object]' 
    }
};

并发送此消息:

var info = {foo: 100};
var message = {
    body: 'some string',
    customProperties: {
        type: 1,
        name: 'test',
        info: JSON.stringify(info)
    }
};

Returns 此消息:

{
    body: 'some string',
    customProperties: {
        type: 1,
        name: 'test',
        info: '\"{\"foo\":100}\"' 
    }
};

当我尝试用 JSON.parse(customProperties.info) 解码时失败了。我认为正在发生的事情是它在每个自定义 属性 上调用 .toString?传递此消息时我如何 encode/decode 一个简单的对象有什么想法吗?

解决此问题的一个解决方案是将 info 编码为另一种格式,这种格式在 Azure's ServiceBus 中的 setRequestHeaders() 调用期间不会被修改。您可以像在第二个解决方案中那样对您的字符串进行 JSON 编码,但随后您可以像这样对结果进行 Base64 编码:

var info = {foo: 100};
var message = {
    body: 'some string',
    customProperties: {
        type: 1,
        name: 'test',
        info: btoa(JSON.stringify(info))
    }
};

这将产生 customProperties 像这样:

{type: 1, name: "test", info: "eyJmb28iOjEwMH0="}

然后解码,你只需要做

var info = JSON.parse(atob(message.customProperties.info));

产生

{foo: 100}