source

JSON에서 새로운 회선을 처리하려면 어떻게 해야 합니까?

bestscript 2023. 1. 6. 19:52

JSON에서 새로운 회선을 처리하려면 어떻게 해야 합니까?

JSON을 생성해서 JavaScript의 오브젝트로 가져오려고 합니다.계속 오류가 나요.제가 가진 건 다음과 같습니다.

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = eval('('+data+')');

에러가 표시됩니다.

unterminated string literal

★★★★★★★★★★★★★★★★ JSON.parse(data)메세지가 」 , 「 」Unexpected token ↵"크롬의 경우, 그리고 "unterminated string literal」를 참조해 주세요.

가가 the the the the the the the the the the the when when when when when 를 꺼내면\n 후에sometext어느 경우든 에러는 해소됩니다. 그런 알 가 없네요\n 만들다eval ★★★★★★★★★★★★★★★★★」JSON.parse

원하는 것은 다음과 같습니다.

var data = '{"count" : 1, "stack" : "sometext\\n\\n"}';

요.\)\JSON의 JSON입니다.

하다를 대체할 수 있는 합니다.\n로로 합니다.\\n의 경우에 data문자열 리터럴이 아닙니다.

function jsonEscape(str)  {
    return str.replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r").replace(/\t/g, "\\\\t");
}

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = JSON.parse(jsonEscape(data));

: " " "dataObj 것이다

Object {count: 1, stack: "sometext\n\n"}

TLDR: 저자의 문제에 대한 해결책.

String.raw★★★★★★★★★★★★★★★★★★:

var data = String.raw`{"count" : 1, "stack" : "sometext\n\n"}`;

어떤 이유에서인지 이 안에 있는 모든 답변은 JavaScript에서 JSON 문자열 표현을 해석하는 방법에 초점을 맞추고 있습니다.이 때문에 실제 JSON에서 새로운 행을 나타내는 방법에 대해 혼동을 일으킬 수 있습니다.후자는 언어에 의존하지 않습니다.

질문 제목에 따라 엄밀하게 설명:

JSON에서 새로운 회선을 처리하려면 어떻게 해야 합니까?

한다고 가정해 보겠습니다.node 어떤 ) : (어느 언어라도 상관없습니다.)


let obj = JSON.parse(fs.readFileSync('file.json'));
console.log(obj.mykey)

다음에 나타내는 것은, 다음의 각 컨텐츠에 대한 출력입니다.file.json:

입력 1:

{
  "mykey": "my multiline
   value"
}

출력 1:

SyntaxError: Unexpected token

입력 2:

{
  "mykey": "my multiline\nvalue"
}

출력 2:

my multiline
value

입력 3:

{
  "mykey": "my multiline\\nvalue"
}

출력 3:

my multiline\nvalue

결론 1:

파일 내의 새 줄을 나타내려면문자를 사용해야 합니다.를 나타내다\n우리는 사용해야 한다\\n.


(입력 파일이 아닌) JavaScript를 사용하여 위의 각 입력을 어떻게 정의해야 합니까?

해야 할 JavaScript JSON이라는 때문에 이 약간 .\n에는 JavaScript 용도 있습니다.그러나 문자 그대로의 수정도 주목해 주십시오.

입력 1:

let input1 = '{"mykey": "my multiline\nvalue"}'

//OR
let input1 = `{
  "mykey": "my multiline
   value"
}`;
//(or even)
let input1 = `{
  "mykey": "my multiline\nvalue"
}`;

//OR
let input1 = String.raw`{
  "mykey": "my multiline
   value"
}`;

console.log(JSON.parse(input1).mykey);

//SyntaxError: Unexpected token
//in JSON at position [..]

입력 2:

let input2 = '{"mykey": "my multiline\\nvalue"}'

//OR
let input2 = `{
  "mykey": "my multiline\\nvalue"
}`;

//OR (Notice the difference from default literal)
let input2 = String.raw`{
  "mykey": "my multiline\nvalue"
}`;

console.log(JSON.parse(input2).mykey);

//my multiline
//value

입력 3:

let input3 = '{"mykey": "my multiline\\\\nvalue"}'

//OR
let input3 = `{
  "mykey": "my multiline\\\\nvalue"
}`;

//OR (Notice the difference from default literal)
let input3 = String.raw`{
  "mykey": "my multiline\\nvalue"
}`;

console.log(JSON.parse(input3).mykey);

//my multiline\nvalue

결론 2:

「」를 jsonjavascript 문자열은 이스케이프가 필요 없기 때문에 사용하는 것이 가장 쉬운 방법입니다(이렇게 이스케이프되는 backtick과는 별개입니다).String.raw`abc${"`"}def` 를 참조해 주세요.

가장 수 있는 .json합니다(javascript를 사용합니다).JSON.stringify를 참조해 주세요.

사양에 따르면 http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf:

의 유니코드 입니다.U+0022가 있는 한 모든 수 따옴표)는 사용할 수 있습니다.★★★★★★★★★★★★★★( )U+0022 솔리더스 )U+005C) 및 문자U+0000로로 합니다.U+001F됩니다. 일부 문자의 이스케이프 시퀀스는 2글자로 표현됩니다.

합격할 수 요.0x0A ★★★★★★★★★★★★★★★★★」0x0C코드를 직접 입력합니다. 에서는 이스케이프 시퀀스 하고 있습니다.에스케이프 시퀀스에서는 코드를 Escape 는 Escape sequence 。U+0000로로 합니다.U+001F:

  • \f 피드 문자형식 피드 문자)를.U+000C를 참조해 주세요.
  • \n 문자줄바꿈 문자)를 .U+000A를 참조해 주세요.

대부분의 프로그래밍 언어가 사용하는 것처럼\견적의 경우 이스케이프 구문을 회피해야 합니다(이중 이스케이프 - 언어/플랫폼용 1회, JSON용 1회).

jsonStr = "{ \"name\": \"Multi\\nline.\" }";

글쎄요, 1개의 CSS 클래스로 간단하게 할 수 있는 경우에는 이 기능을 만들 필요가 없습니다.

이 클래스에서 텍스트를 감싸고 매직 보기만 하면 됩니다.d

 <p style={{whiteSpace: 'pre-line'}}>my json text goes here \n\n</p>

주의: 텍스트는 항상 HTML을 사용하여 프런트 엔드에 표시되므로 p 태그뿐만 아니라 style="whiteSpace: 'pre-line'}"을(를) 임의의 태그에 추가할 수 있습니다.

예를 들어 JSON 필드의 값을 쓸 때 서버에서 문자열을 이스케이프하거나 클라이언트브라우저에서 값을 취득할 때 이스케이프를 해제할 수 있습니다.

모든 주요 브라우저의 JavaScript 구현에는 unescape 명령어가 있습니다.

예:

서버:

response.write "{""field1"":""" & escape(RS_Temp("textField")) & """}"

브라우저에서:

document.getElementById("text1").value = unescape(jsonObject.field1)

문자열을 이스케이프하기 위해 다음 C# 함수를 조사할 수 있습니다.

http://www.aspcode.net/C-encode-a-string-for-JSON-JavaScript.aspx

public static string Enquote(string s)  
{ 
    if (s == null || s.Length == 0)  
    { 
        return "\"\""; 
    } 
    char         c; 
    int          i; 
    int          len = s.Length; 
    StringBuilder sb = new StringBuilder(len + 4); 
    string       t; 

    sb.Append('"'); 
    for (i = 0; i < len; i += 1)  
    { 
        c = s[i]; 
        if ((c == '\\') || (c == '"') || (c == '>')) 
        { 
            sb.Append('\\'); 
            sb.Append(c); 
        } 
        else if (c == '\b') 
            sb.Append("\\b"); 
        else if (c == '\t') 
            sb.Append("\\t"); 
        else if (c == '\n') 
            sb.Append("\\n"); 
        else if (c == '\f') 
            sb.Append("\\f"); 
        else if (c == '\r') 
            sb.Append("\\r"); 
        else 
        { 
            if (c < ' ')  
            { 
                //t = "000" + Integer.toHexString(c); 
                string t = new string(c,1); 
                t = "000" + int.Parse(tmp,System.Globalization.NumberStyles.HexNumber); 
                sb.Append("\\u" + t.Substring(t.Length - 4)); 
            }  
            else  
            { 
                sb.Append(c); 
            } 
        } 
    } 
    sb.Append('"'); 
    return sb.ToString(); 
} 

JSON 데이터를 구문 분석하기 위해 데이터의 줄 바꿈 또는 다른 문자를 제거하기 위해 이 기능을 사용했습니다.

function normalize_str($str) {

    $invalid = array(
        'Š'=>'S', 'š'=>'s',  'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z',
        'Č'=>'C', 'č'=>'c',  'Ć'=>'C',  'ć'=>'c',  'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A',
        'Ä'=>'A', 'Å'=>'A',  'Æ'=>'A',  'Ç'=>'C',  'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E',
        'Ì'=>'I', 'Í'=>'I',  'Î'=>'I',  'Ï'=>'I',  'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
        'Õ'=>'O', 'Ö'=>'O',  'Ø'=>'O',  'Ù'=>'U',  'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y',
        'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a',  'á'=>'a',  'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a',
        'æ'=>'a', 'ç'=>'c',  'è'=>'e',  'é'=>'e',  'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i',
        'î'=>'i', 'ï'=>'i',  'ð'=>'o',  'ñ'=>'n',  'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
        'ö'=>'o', 'ø'=>'o',  'ù'=>'u',  'ú'=>'u',  'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
        'ÿ'=>'y', 'Ŕ'=>'R',  'ŕ'=>'r',
        "`" => "'", "´" => "'",  '"' => ',',  '`' => "'",
        '´' => "'", '"' => '\"', '"' => "\"", '´' => "'",
        "&acirc;€™" => "'",
        "{" => "",
        "~" => "",  "–" => "-",  "'" => "'",  "     " => " ");

    $str = str_replace(array_keys($invalid), array_values($invalid), $str);

    $remove = array("\n", "\r\n", "\r");
    $str = str_replace($remove, "\\n", trim($str));

    //$str = htmlentities($str, ENT_QUOTES);

    return htmlspecialchars($str);
}

echo normalize_str($lst['address']);

PHP 4에서 json_encode(PHP 5에서 사용 가능)를 에뮬레이트하기 위한 클래스를 만들다가 이 문제가 발생했습니다.제가 생각해낸 것은 다음과 같습니다.

class jsonResponse {
    var $response;

    function jsonResponse() {
        $this->response = array('isOK'=>'KO', 'msg'=>'Undefined');
    }

    function set($isOK, $msg) {
        $this->response['isOK'] = ($isOK) ? 'OK' : 'KO';
        $this->response['msg'] = htmlentities($msg);
    }

    function setData($data=null) {
        if(!is_null($data))
            $this->response['data'] = $data;
        elseif(isset($this->response['data']))
            unset($this->response['data']);
    }

    function send() {
        header('Content-type: application/json');
        echo '{"isOK":"' . $this->response['isOK'] . '","msg":' . $this->parseString($this->response['msg']);
        if(isset($this->response['data']))
            echo ',"data":' . $this->parseData($this->response['data']);
        echo '}';
    }

    function parseData($data) {
        if(is_array($data)) {
            $parsed = array();
            foreach ($data as $key=>$value)
                array_push($parsed, $this->parseString($key) . ':' . $this->parseData($value));
            return '{' . implode(',', $parsed) . '}';
        }
        else
            return $this->parseString($data);
    }

    function parseString($string) {
            $string = str_replace("\\", "\\\\", $string);
            $string = str_replace('/', "\\/", $string);
            $string = str_replace('"', "\\".'"', $string);
            $string = str_replace("\b", "\\b", $string);
            $string = str_replace("\t", "\\t", $string);
            $string = str_replace("\n", "\\n", $string);
            $string = str_replace("\f", "\\f", $string);
            $string = str_replace("\r", "\\r", $string);
            $string = str_replace("\u", "\\u", $string);
            return '"'.$string.'"';
    }
}

저는 여기에 언급된 규칙을 지켰습니다.저는 필요한 것만 사용했는데, 사용하시는 언어로 필요에 맞게 사용하실 수 있을 것 같습니다.내 경우 문제는 내가 처음에 생각했던 것처럼 새로운 라인에 관한 것이 아니라 탈출하지 못하는 것에 관한 것이었다.제가 뭘 잘못했는지 다른 사람이 제가 겪었던 작은 두통에서 벗어나길 바랍니다.

복사 수 있기 이 을 직접 하여 j j j j j j j j j j j j j j j j j j, JSON j j j as as as as as as as as as as as as as에 복사해 .JSON을 코드에 직접 복사하여 붙여넣을 수 있기 때문입니다.JSON, JSON, JSON, JSON, JSON, JSON, JSON, JSON.dataObj 않은 " " " " " " " " " ) 。eval==evil

var dataObj = {"count" : 1, "stack" : "sometext\n\n"};

console.log(dataObj);

언급URL : https://stackoverflow.com/questions/42068/how-do-i-handle-newlines-in-json