Как разобрать объект JSON в Spring AMQP?
Существует удаленный сервер 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, но как я могу преобразовать его в читаемый формат?
2 ответа
Скорее всего, сообщение отправляется в неправильном формате (строковый массив байтов), поэтому вы получаете такую форму сообщения. Либо измените отправителя, либо преобразуйте это в правильную строку, подобную этой.
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());
какие выходы
{ "Действие": "GetInfo", "результат": "NotRegistered", "полезная нагрузка": нулевая}
Есть еще один хороший ответ на мой вопрос.
Вы можете просто изменить сигнатуру изменяющего аргумента метода слушателя из 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}'
Вы также можете посмотреть похожую проблему здесь: Преобразование сообщения из RabbitMQ в строку /json