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}
我正在将消息传递给第三方消息队列,该消息队列将消息中继到我的队列侦听器(全部在 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}