【发布时间】:2017-07-18 14:26:45
【问题描述】:
我正在编写一个 websocket 客户端,我想以 json 字符串的形式接收消息。为此,我需要登录。如果登录不正确,我会发送一个没有成功的 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 服务器是一个码头服务器,它在 json 中发送一个字符串和一个字符串数组,用 Google 的 gson.toJson(class) Gson 解析为 json。 Class 是一个包含 String 动作和 String 数组参数的类。
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 来完成,不是吗?
【问题讨论】:
-
jsbin.com/morutob/1/edit?js,console — 我无法重现该问题。
evt.data的值你肯定搞错了。 -
如果我在 JSON.parse() 中写入 evt.data 的值;像 JSON.parse("{\"action\":\"login\",\"args\":[\"nosuccess\"]}");手动然后将其解析为对象
-
@Quentin evt.data 是我在帖子中解释的字符串
-
如果您手动编写它并获取一个对象,但从
evt.data获取它并且不要......那么您手动编写的内容和您从evt.data获取的内容是不同的 所以你肯定对evt.data的值有误。 -
我遇到了完全相同的问题,这是一个被字符串化了两次的对象
标签: javascript json websocket