JSON.parse가 개체 대신 문자열을 반환합니다.
저는 웹 소켓 클라이언트를 쓰고 있는데 메시지를 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 서버는 json에서 gson.toJson(클래스) Gson으로 구문 분석된 json으로 문자열과 문자열 배열을 Google에서 전송하는 jety 서버입니다.클래스는 String 액션 및 String 배열 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를 1개만 사용해야 하는 이유는 무엇입니까?
이것은 과도한 문자열과 상당히 일치하는 것으로 보입니다.예를 들어 텍스트 파일을 로드한 경우FileReader.readAsText
에 부속된\n
그리고.\r
콘솔에 표시해놨어요. 그래서 제가...(JSON.stringify(reader.result)).replace(/(?:\\[rn])+/g, '')
먼저 상징을 보고, 그 다음에 없애버리죠.그것을 받아들여 실행하다JSON.parse()
비문자열로 변환하기 때문에 실행할 수 있습니다.JSON.parse()
다시 오브젝트를 만듭니다.
문자열을 문자열화하지 않으면 객체로 변환되며 대부분의 경우 필수는 아니지만 취득한 값을 제어할 수 없는 경우 실행 중JSON.parse()
두 번이면 효과가 있다.
@Derp Superleggera가 맞습니다.이 문제는 실제로 과도한 문자열입니다.
let arr = "[\"~#iM\",[\"is_logged_out_token\",false,\"token_type\",\"Bearer\"]]"
그래서 물건으로 해석하기 위해 그냥 훑어봤어요JSON.parse
두 번이나 성공했어!
let obj = JSON.parse(JSON.parse(arr))
다른 분들이 댓글로 말씀하신 것처럼 이 문제는 해결된 것 같습니다.서버로부터 「stringed object」로서 응답을 수신하고 있는 경우는, 다음과 같이 JSON.parse()를 사용해 통상적인 오브젝트로 변환할 수 있습니다.
var stringResponse = '{"action":"login","args":["nosuccess"]}';
var objResponse = JSON.parse(stringResponse);
console.log(objResponse.args);
위의 코드를 여기에서 시험해 볼 수도 있습니다.
사용자가 정말로 개체를 원했을 때 서버가 문자열을 반환하는 이유는 백엔드 코드, 사용 중인 라이브러리 및 전송 프로토콜에 있습니다.프런트 엔드 코드가 기능하도록 하려면 , JSON.parse 를 사용합니다.백엔드가 응답하는 방법을 편집하려면 자세한 정보를 제공하십시오.
체크된 응답은 문자열 과다로 인한 문제인 것으로 생각되므로 정확합니다.프로젝트에서 AWS Amplify AWSJSON 타입을 사용하다가 우연히 알게 되었습니다.나에게 효과가 있었던 해결책은 물건을 얻기 위해 여러 번 반복하는 것이었다.
구문 분석 시 객체를 반환하는 간단한 JS 함수를 작성했습니다.에러 체크가 아니라 시작점이 있습니다.
export function jsonParser(blob) {
let parsed = JSON.parse(blob);
if (typeof parsed === 'string') parsed = jsonParser(parsed);
return parsed;
}
언급URL : https://stackoverflow.com/questions/42494823/json-parse-returns-string-instead-of-object
'programing' 카테고리의 다른 글
Angular JS - "Controller as vm"을 사용하는 이유 (0) | 2023.03.05 |
---|---|
다른 콘텐츠를 로드한 후 Select 2 드롭다운 메뉴를 새로 고치는 방법 (0) | 2023.03.05 |
스프링 데이터 JPA에서 두 테이블 도면요소 결합 (0) | 2023.03.05 |
API 앱과 웹 앱의 차이점은 무엇입니까? (0) | 2023.03.05 |
WooCommerce를 구매하려면 등록이 필요합니다. (0) | 2023.03.05 |