我正在编写一个 WebSocket 客户端,希望能够接收 JSON 格式的消息。为此,我需要进行登录。如果登录不成功,我将发送一个包含“nosuccess”的 JSON 字符串。
JSON 字符串:{"action":"login","args":["nosuccess"]}
在客户端,我使用以下代码获取字符串:
WebSocket socket = new WebSocket("ws://localhost:2555/api");
socket.onmessage = function(evt) {
console.log(evt.data);
console.log(typeof(evt.data));
onMessage(evt);
}
function onMessage(evt) {
var data = JSON.parse(evt.data);
var action = data.action;
var args = data.args;
console.log(data);
console.log(typeof(data));
console.log(action);
console.log(args);
但数据类型是字符串...为什么呢?
evt.data返回:
"{\"action\":\"login\",\"args\":[\"nosuccess\"]}"
数据返回:
{"action":"login","args":["nosuccess"]}
WebSocket服务器是一个Jetty Server,它使用Google的Gson将字符串和字符串数组以json格式发送,并进行解析。Class是一个包含String action和String array args的类。
websocket.js的完整源代码:
var socket;
function openWebsocket(adress) {
socket = new WebSocket(adress);
socket.onopen = function(evt) {
console.log("Socket opened [" + adress + "]");
};
socket.onclose = function(evt) {
loadPage("login.html");
console.log("Socket closed [" + evt.code + "]");
}
socket.onmessage = function(evt) {
onMessage(evt);
}
socket.onerror = function(evt) {
console.log("Socket couldn't connect [" + evt.message + "]");
showMessage("fa-exclamation-circle", "Socket couldn't be established!", 1000);
}
}
function onMessage(evt) {
var data = JSON.parse(evt.data);
var action = data.action;
var args = data.args;
console.log(data);
console.log(typeof(data));
console.log(action);
console.log(args);
$(".card-container h3").html(data);
if(action == "login") {
if(args[0] == "success") {
loadPage("dashboard.htm");
currentpage = "dashboard.htm";
showMessage("fa-check", "Du wurdest erfolgreich eingeloggt", 2000);
} else if(args[0] == "nosuccess") {
loadPage("login.html");
currentpage = "login.html";
showMessage("fa-exclamation-circle", "Falscher Benutzername oder falsches Passwort", 2000);
} else if(args[0] == "unauthenticated") {
loadPage("login.html");
currentpage = "login.html";
showMessage("fa-exclamation-circle", "Login failure: not authenticated", 2000);
}
}
}
function sendMessage(json) {
$(".card-container h3").html(JSON.stringify(json));
console.log(JSON.stringify(json));
socket.send(JSON.stringify(json));
}
如果我更改这一行:
var data = JSON.parse(evt.data);
转换为:
var data = JSON.parse("{\"action\":\"login\",\"args\":[\"nosuccess\"]}");
然后它是一个json对象,但当我使用evt.data时,它是一个字符串。如果我将该行更改为:
var data = JSON.parse(JSON.parse(evt.data));
然后它就可以运行了,但是为什么呢?通常情况下应该只需要一次JSON.parse,对吧?
evt.data
的值有误解。 - Quentinevt.data
中获取它而不是手动编写,则您手动编写的内容和从evt.data
中获取的内容是不同的,因此您可能对evt.data
的值存在误解。 - Quentin