【问题标题】:How to parse JSON object in Spring AMQP?如何在 Spring AMQP 中解析 JSON 对象?
【发布时间】:2018-09-03 09:29:04
【问题描述】:

有一个远程 RabbitMQ 服务器只允许我发送和接收消息。这意味着我无法创造任何东西。我发送某个请求并以 JSON 格式得到答案。

在我的应用程序中,我有一个简单的 Receiver 类:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class Receiver {

@RabbitListener(queues = "QueueName")
    public void receive(String in) {
        System.out.println(" [x] Received '" + in + "'");
    }
}

我希望收到一个 JSON 对象。而不是这个,我得到一堆数字:

 [x] Received '123,34,97,99,116,105,111,110,34,58,34,103,101,116,73,110,102,111,34,44,34,114,101,115,117,108,116,34,58,34,78,111,116,82,101,103,105,115,116,101,114,101,100,34,44,34,112,97,121,108,111,97,100,34,58,110,117,108,108,125'

我想那是 JSON 对象,但我怎样才能将其转换为可读格式?

【问题讨论】:

  • 那是一个json?怎么会?在哪里?
  • 您好,您能展示一下如何将这些 json 字符串排入 RabbitMQ 队列吗?

标签: java spring rabbitmq amqp spring-amqp


【解决方案1】:

很可能消息以错误的格式(字符串化的字节数组)发送,因此您收到了这种形式的消息。修改发件人或将其转换为类似的正确字符串。

    String str = "123,34,97,99,116,105,111,110,34,58,34,103,101,116,73,110,102,111,34,44,34,114,101,115,117,108,116,34,58,34,78,111,116,82,101,103,105,115,116,101,114,101,100,34,44,34,112,97,121,108,111,97,100,34,58,110,117,108,108,125";
    String[] chars = str.split(",");
    StringBuilder builder = new StringBuilder();
    Arrays.asList(chars).stream().map(Byte::valueOf).forEach(b -> builder.append((char)b.byteValue()));
    System.out.println(builder.toString());

哪个输出

{"action":"getInfo","re​​sult":"NotRegistered","payload":null}

【讨论】:

  • 这正是我所需要的。谢谢你。但是在接收时是否不可能将这些字节转换为字符串?这样会更方便。
【解决方案2】:

我的问题还有一个很好的答案。

您可以简单地将侦听器方法更改参数的签名从String 更改为org.springframework.amqp.core.Message。它看起来像这样:

public void receive(Message in) {

输出将是:

[x] Received '(Body:'{"action":"getInfo","result":"NotRegistered","payload":null}' MessageProperties [headers={timestamp_in_ms=1536656426171}, timestamp=Tue Sep 11 16:00:26 KRAT 2018, contentType=application/json, contentLength=0, redelivered=false, receivedExchange=, receivedRoutingKey=routing_key, deliveryTag=1, consumerTag=amq.ctag-gHh9m1_cs52ramBUle_x0A, consumerQueue=queue])'

如果您不想获取有关消息的所有信息,那么侦听器方法将是:

@RabbitListener(queues = "queue")
    public void receive(Message in) {
        String body = new String(in.getBody());
        System.out.println(" [x] Received '" + body + "'");
    }

我想这个输出现在更适合你:

 [x] Received '{"action":"getInfo","result":"NotRegistered","payload":null}'

您也可以在这里查看类似的问题: Converting Message from RabbitMQ into string/json

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 2011-07-30
    • 2015-05-18
    • 2013-04-06
    • 2017-09-03
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多