JSON.parse 返回字符串而不是对象

新手上路,请多包涵

我正在写一个 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 许可协议

阅读 884
2 个回答

这似乎与 过度 字符串化的字符串相当一致。 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() 两次就可以了。

原文由 DerpSuperleggera 发布,翻译遵循 CC BY-SA 4.0 许可协议

@DerpSuperleggera 是正确的。这个问题确实是一个 过度 字符串化的字符串

let arr = "[\"~#iM\",[\"is_logged_out_token\",false,\"token_type\",\"Bearer\"]]"

所以为了将它解析为一个对象,我只是通过 JSON.parse 运行了两次,这就成功了!

 let obj = JSON.parse(JSON.parse(arr))

原文由 Madhur 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题