سؤال

لقد قمت بإنشاء بعض ملفات JSON وأحاول سحبها إلى كائن في JavaScript.أستمر في الحصول على الأخطاء.وهنا ما لدي

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

هذا يعطيني خطأ

unterminated string literal

مع JSON.parse(data), ، أرى رسائل خطأ مشابهة:"Unexpected token ↵"في Chrome، و"unterminated string literal" في Firefox و IE.

عندما أقوم بإخراج \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"}

وفقا للمواصفات: http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf

A string is a sequence of Unicode code points wrapped with quotation marks
(U+0022). All characters may be placed within the quotation marks except for the
characters that must be escaped: quotation mark (U+0022), reverse solidus
(U+005C), and the control characters U+0000 to U+001F. There are two-character
escape sequence representations of some characters.

لذلك لا يمكنك المرور 0x0A أو 0x0C رموز مباشرة.ممنوع!تقترح المواصفات استخدام تسلسلات الهروب لبعض الرموز المحددة جيدًا من U+0000 ل U+001F:

\f  represents the form feed character (U+000C). 
\n  represents the line feed character (U+000A).

كما تستخدم معظم لغات البرمجة \ للاقتباس يجب عليك الهروب من بناء جملة الهروب (الهروب المزدوج - مرة واحدة للغة/النظام الأساسي، ومرة ​​واحدة لـ Json نفسه):

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

يمكنك فقط الهروب من السلسلة الخاصة بك في الخادم عند كتابة قيمة حقل json وإلغاء الهروب منها عند استرداد القيمة في متصفح العميل، على سبيل المثال.

يحتوي تطبيق جافا سكريبت في جميع المتصفحات الرئيسية على أمر unscape.

مثال:في الخادم:

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']);

لقد واجهت هذه المشكلة أثناء إنشاء فصل دراسي في PHP4 لمحاكاة json_encode (متوفر في PHP5).وهنا ما توصلت إليه:

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.'"';
    }
}

لقد اتبعت القواعد المذكورة هنا.لقد استخدمت ما أحتاجه فقط ولكن أعتقد أنه يمكنك تكييفه مع احتياجاتك باللغة التي تستخدمها.لم تكن المشكلة في حالتي تتعلق بالأسطر الجديدة كما اعتقدت في الأصل ولكن تتعلق بـ/عدم الهروب.آمل أن يمنع هذا شخصًا آخر من الصداع الصغير الذي أصابني عندما اكتشفت الخطأ الذي ارتكبته.

إزالة علامات الاقتباس المفردة (نصيحة: eval==evil)

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

console.log(dataObj);

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top