RabbitMQ-发送JSON消息

RabbitMQ-发送JSON消息,rabbitmq,Rabbitmq,我使用内容类型application/json发送以下消息: 但是,当我从同一RabbitMQ Web控制台获取消息时,它会将负载显示为字符串 我做错了什么?还是我根本就误解了,而且负载总是字符串类型?来自官方: AMQP消息还有一个有效负载(它们携带的数据),AMQP代理将其视为不透明字节数组。代理不会检查或修改有效负载。消息可能只包含属性而不包含有效负载。通常使用JSON、Thrift、Protocol Buffers和MessagePack等序列化格式对结构化数据进行序列化,以便将其发

我使用内容类型application/json发送以下消息:

但是,当我从同一RabbitMQ Web控制台获取消息时,它会将负载显示为字符串

我做错了什么?还是我根本就误解了,而且负载总是字符串类型?

来自官方:

AMQP消息还有一个有效负载(它们携带的数据),AMQP代理将其视为不透明字节数组。代理不会检查或修改有效负载。消息可能只包含属性而不包含有效负载。通常使用JSON、Thrift、Protocol Buffers和MessagePack等序列化格式对结构化数据进行序列化,以便将其发布为消息负载。AMQP对等方通常使用“内容类型”和“内容编码”字段来传递此信息,但这只是按照惯例


所以基本上,RabbitMQ对JSON一无所知,所有消息都只是它的字节数组

,对于任何使用.Net通过RabbitMQ发送对象的人来说

您必须将JSON对象序列化为字节数组,通过RabbitMQ发送,然后在接收后反序列化。您可以这样做:

 byte[] messagebuffer = Encoding.Default.GetBytes(JsonConvert.SerializeObject(accountMessage) );
AccountMessage receivedMessage = JsonConvert.DeserializeObject<AccountMessage>(Encoding.UTF8.GetString(body));
安装Newtonsoft JSON库

using Newtonsoft.Json;
为JSON对象消息(在本例中为AccountMessage)创建一个模型

将对象序列化为字节数组,如下所示:

 byte[] messagebuffer = Encoding.Default.GetBytes(JsonConvert.SerializeObject(accountMessage) );
AccountMessage receivedMessage = JsonConvert.DeserializeObject<AccountMessage>(Encoding.UTF8.GetString(body));
收到消息数据后,可以按如下方式反序列化:

 byte[] messagebuffer = Encoding.Default.GetBytes(JsonConvert.SerializeObject(accountMessage) );
AccountMessage receivedMessage = JsonConvert.DeserializeObject<AccountMessage>(Encoding.UTF8.GetString(body));
AccountMessage receivedMessage=JsonConvert.DeserializeObject(Encoding.UTF8.GetString(body));

来自
NodeJS
上下文:


如果我们想将JSON对象作为消息发送,可能会出现以下错误:

第一个参数必须是string类型或Buffer实例, ArrayBuffer、数组或类似数组的对象。收到一个 反对

因此,我们可以将JSON负载转换为字符串,并在worker中解析它。在将数据发送到队列之前,我们将JSON对象字符串化-

让payloadAsString=JSON.stringify(有效载荷)

从worker端开始,我们可以解析JSON.parse

let payload = JSON.parse(msg.content.toString());
//then access the object as we normally do, i.e. :
let id = payload.id;

内容类型和编码

内容(MIME媒体)类型和内容编码字段允许发布者传达消费者应如何反序列化和解码消息负载

RabbitMQ不验证或使用这些字段,它是为应用程序和插件使用和解释而存在的。


顺便说一下,使用rabbitMQ web gui,您可以使用单词content\u type,但是在代码(javascript确认)中,您可以使用关键字名称contentType。这是一个细微的差别,但足以让你发疯。

为什么你认为这个问题是关于.NET的?我在Rabbit MQ中搜索如何发送对象时发现了这个问题,我使用.NET,所以其他人可能会发现我在这里找到的解决方案很有用,.这个答案对我来说很有效,应该是公认的答案。下面这个答案更为贴切:问题是关于理解有效载荷是什么,我回答了这个问题。是的,但我发现另一个答案更为贴切。说到点子上了。理解发生了什么是可以的,但更重要的是知道如何解决这个问题