Quarkus后端返回MessageJson非JSON格式,前端解析失败求助
解决Quarkus WebSocket返回标准JSON的问题
问题根源
你现在调用messageJson.toString()得到的是Java对象的默认字符串表示,这根本不是标准JSON格式,所以前端JSON.parse()必然解析失败。核心是要把MessageJson对象序列化为标准JSON字符串,而非依赖默认的toString方法。
原生实现方案(无需额外依赖)
Quarkus默认集成了Jackson作为JSON处理工具,完全可以原生实现序列化,不需要引入GSON:
- 在WebSocket端点类中注入Quarkus管理的
ObjectMapper实例:
import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.inject.Inject; import jakarta.websocket.OnMessage; import jakarta.websocket.Session; import jakarta.websocket.server.ServerEndpoint; @ServerEndpoint("/chat") public class ChatWebSocket { @Inject ObjectMapper objectMapper; @OnMessage public void onMessage(String message, Session session) throws Exception { // 假设已解析得到MessageJson对象 MessageJson messageJson = ...; // 序列化为标准JSON字符串 String jsonStr = objectMapper.writeValueAsString(messageJson); // 发送给前端 session.getBasicRemote().sendText(jsonStr); } }
- 确保
MessageJson是普通POJO,字段有对应的getter方法(Jackson默认通过getter序列化字段),如需自定义字段名可添加Jackson注解:
import com.fasterxml.jackson.annotation.JsonProperty; public class MessageJson { @JsonProperty("to_recipient") private String toRecipient; private String content; // 必须提供getter方法 public String getToRecipient() { return toRecipient; } public String getContent() { return content; } // setter和构造方法按需添加 }
关于@Produces注解
@Produces是JAX-RS(REST接口)中指定响应媒体类型的注解,WebSocket端点完全用不上。WebSocket发送的是文本消息,直接返回序列化后的JSON字符串即可。
是否需要依赖GSON
不需要,Quarkus原生集成的Jackson已经能满足所有常规JSON序列化需求。除非项目中已大量使用GSON,或有Jackson不支持的特殊序列化逻辑,否则没必要额外引入GSON依赖。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

