我正在编写一个websocket客户端,我希望以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.数据返回:

 "{\"action\":\"login\",\"args\":[\"nosuccess\"]}"

数据返回:

 {"action":"login","args":["nosuccess"]}

The WebSocket server is a jetty Server which sends a string and a string array in json parsed in json with gson.toJson(class) Gson by Google. The Class is a class containing String action and 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));
}

If I change this line:

 var data = JSON.parse(evt.data);

对此,请执行以下操作:

var data = JSON.parse("{\"action\":\"login\",\"args\":[\"nosuccess\"]}");

Then it is a json object, but when I use evt.data then it is a string. If I change the line 对此,请执行以下操作:

    var data = JSON.parse(JSON.parse(evt.data));

Then it works, but why, normally it should do it with only one JSON.parse, should it?

推荐答案

This seems to be fairly consistent with over-stringified strings. 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, '') first to see the symbols, then to get rid of them. Taking that and running JSON.parse() on it converts it to a non-escaped string, so running JSON.parse() again creates an object.

If you do not stringify your string, it will convert to an object and often it is not necessary but if you have no control over the obtained value, then running JSON.parse() twice will do the trick.

Json相关问答推荐

如何编写MongoDB查询以返回数组数组

如何在Haskell中解析JSON,其中字段的名称可以是多个值之一,但应该转换为单个Haskell类型?

织女星-没有循环的动画条形图第二部分(实际上是织女星)

集成wix.comstore API|变音符号问题

将PostgreSQL转换为JSON对象

基于 JSON 字段的 Jolt 条件标志

如何避免解析 ISuperObject 类型字段中的 json 对象

展平多个数组以保持顺序

使用 Power BI 中的 Deneb 视觉效果绘制面积图中的 X 轴日期

如何使用SQLite Trigger将JSON对象数组转换为新记录?

Jolt 不打印任何东西

如何在 terraform 输出中打印一组用户信息

如何 Select 一个值,这是可选的 - 使用 jq

使用带有逗号的字段名称构建 struct

如何使用 gson 调用默认反序列化

与classic 规范化表相比,postgres JSON 索引是否足够高效?

如何将单引号转义成双引号转成单引号

Javascript:如何判断 AJAX 响应是否为 JSON

Laravel 5 控制器将 JSON 整数作为字符串发送

如何在本地存储中存储对象数组?