我正在写一个 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 中发送一个字符串和一个字符串数组,谷歌用 gson.toJson(class) Gson 在 json 中解析。该类是一个包含字符串操作和字符串数组参数的类。
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 来完成,不是吗?
原文由 Nightloewe 发布,翻译遵循 CC BY-SA 4.0 许可协议
这似乎与 过度 字符串化的字符串相当一致。 For example I loaded a text file using
FileReader.readAsText
that came with\n
and\r
which rendered in the console, so I did -(JSON.stringify(reader.result)).replace(/(?:\\[rn])+/g, '')
首先看到符号,然后摆脱它们。获取并运行JSON.parse()
将其转换为非转义字符串,因此运行JSON.parse()
再次创建一个对象。如果您不对您的字符串进行字符串化,它会转换为一个对象,而且通常没有必要,但如果您无法控制获得的值,那么运行
JSON.parse()
两次就可以了。