আমি কীভাবে জেএসএনে নতুন লাইনগুলি পরিচালনা করব?


289

আমি কিছু জেএসওএন তৈরি করেছি এবং আমি এটি জাভাস্ক্রিপ্টের কোনও বস্তুতে টানতে চেষ্টা করছি। আমি ত্রুটি পেতে থাকি। আমার যা আছে তা এখানে:

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

এটি আমাকে একটি ত্রুটি দেয়:

unterminated string literal

এর সাথে JSON.parse(data), আমি অনুরূপ ত্রুটি বার্তাগুলি দেখতে পাচ্ছি: " Unexpected token ↵" ক্রোমে এবং " unterminated string literal" ফায়ারফক্স এবং আইই তে।

যখন আমি খুঁজে নিতে \nপর sometextত্রুটি উভয় ক্ষেত্রেই দূরে চলে যায়। আমি কেন জিনিসটা মনে করতে পারে না \nতোলে evalএবং JSON.parseব্যর্থ হয়।


19
ইওল এর পরিবর্তে একটি আসল জসন পার্সার ব্যবহার করে দেখুন।
এরিক

উত্তর:


368

আমার ধারণা আপনি এটি চান:

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

(আপনার স্ট্রিংয়ে আপনাকে "\" এড়াতে হবে (এটিকে ডাবল - "\" রূপান্তরিত করতে হবে)), অন্যথায় এটি JSON ডেটা নয়, JSON উত্সে একটি নতুন লাইন হয়ে যাবে)


101
এটি অবশ্যই সঠিক, তবে আমি এটি করার কারণটি যুক্ত করতে চাই: ietf.org/rfc/rfc4627.txtজেএসওএন অনুচ্ছেদে এই বিভাগটি 2.5 এর অন্তর্ভুক্ত রয়েছে: "সমস্ত ইউনিকোড অক্ষর মধ্যে থাকতে পারে অক্ষরগুলি ব্যতীত উদ্ধৃতি চিহ্নগুলি যে এড়ানো উচিত: উদ্ধৃতি চিহ্ন, বিপরীত কঠিন, এবং নিয়ন্ত্রণের অক্ষর (U + 0000 U + 001F এর মাধ্যমে) "। যেহেতু একটি নিউলাইন হ'ল একটি নিয়ন্ত্রণ চরিত্র, তাই এড়াতে হবে।
ড্যানিয়েল কুলম্যান

1
Www.json.org অনুসারে JSON স্ট্রিংগুলিতে "\ n" কন্ট্রোল সিকোয়েন্স গ্রহণ করে - এবং আপনি যদি JSON.parse (['"a \\ না"']) চেষ্টা করেন তবে [1] .CCCCAAt (); এটি 10 ​​প্রদর্শন করবে - যা আমি শেষবার চেক করেছিলাম "লাইনফিড" ছিল। --- বিটিডাব্লু: চিৎকার বন্ধ করুন!
11:25

+ ১. আমি জেএসএন-এনকোডিং বুঝতে সমস্যা হচ্ছিলাম তবে "জেএসএন উত্সে একটি নতুন লাইন হয়ে উঠবে, জেএসওএন ডেটা নয়" এটি আমার জন্য পরিষ্কার করে দিয়েছে।
amucunguzi

44

আপনি একটি ফাংশন যা প্রতিস্থাপন আছে প্রয়োজন হবে \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"}

3
আপনাকে আপনার পালানোর অক্ষরগুলি (যেমন .replace("\\n", "\\\\n")) থেকে পালাতে হবে এবং আমি একাধিক উদাহরণের (উদাহরণস্বরূপ .replace(/\n/g, "\\\\n")) প্রতিস্থাপন করতে
রেগেক্স

2
আপনার পালানোর চরিত্রগুলি কেন পালাতে হবে? মানে কিছু একটা .replace("\n", "\\n")ঠিকঠাক কাজ করা উচিত !! উদাহরণস্বরূপ, var test = [{"description":"Some description about the product. This can be multi-line text."}]; console.log(JSON.parse(test.replace(/\n/g, "\\n")));ব্রাউজার কনসোলের জন্য অবজেক্টটি পুরোপুরি সূক্ষ্মভাবে আউটপুট দেবে[{"description":"Some description about the product.\nThis can be multi-line text."}]
ফ্র0zenFyr

বিটিডাব্লু, উপরের মন্তব্যে, আসল জেএসএন স্ট্রিংয়ে একটি নতুন লাইন রয়েছে, যা স্ট্যাকওভারফ্লোর মন্তব্য বিন্যাসক দ্বারা সরানো হয়েছে .. আপনি দেখতে পারেন যে প্রতিস্থাপনের পরে চূড়ান্ত আউটপুটটি মানটিতে একটি নতুন-লাইন চর প্রবেশ করানো উচিত \n
ফ্র0zenFyr

1
-1 এই উত্তরটি প্রথমে অবৈধ জেএসওনের একটি স্ট্রিং তৈরি করে (যেহেতু নিউলাইন একটি নিয়ন্ত্রণ চরিত্র), তারপরে এটি অসম্পূর্ণ প্রতিস্থাপনের সিরিজের (3 টিরও বেশি নিয়ন্ত্রণের অক্ষর রয়েছে) দিয়ে এটি ঠিক করার চেষ্টা করে। তারপরে এটি শীর্ষে রাখতে, এটি evalফাংশনটি ব্যবহার করতেও পরিচালনা করে। 17 উর্ধ্বতন ???
ফিল

1
উদ্ধৃতি চিহ্নগুলি সম্পর্কে কী বলা যায় যেগুলি পালাতে হবে?
একা দাঁড়িয়ে

8

নির্দিষ্টকরণ অনুসারে, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf :

স্ট্রিংটি ইউনিকোড কোড পয়েন্টের একটি ক্রম যা উদ্ধৃতি চিহ্ন ( U+0022) দিয়ে মোড়ানো । সমস্ত অক্ষর অক্ষর আছে যা পলান করা আবশ্যক ছাড়া উদ্ধৃতি চিহ্ন মধ্যে স্থাপন করা হতে পারে: উদ্ধৃতি চিহ্ন ( U+0022), বিপরীত solidus ( U+005C), এবং নিয়ন্ত্রণ অক্ষর U+0000থেকে U+001F। কিছু অক্ষরের দ্বি-চরিত্রের পালানোর ক্রম উপস্থাপনা রয়েছে।

সুতরাং আপনি সরাসরি পাস 0x0Aবা 0x0Cকোড করতে পারবেন না । এটা নিষিদ্ধ! স্পেসিফিকেশন থেকে কিছু ভালভাবে সংজ্ঞায়িত কোডগুলি পালাবার ক্রম ব্যবহার করতে প্রস্তাব দেওয়া U+0000থেকে U+001F:

  • \fফর্ম ফিড অক্ষর উপস্থাপন করে ( U+000C)।
  • \nলাইন ফিড অক্ষর উপস্থাপন করে ( U+000A)।

যেহেতু বেশিরভাগ প্রোগ্রামিং ভাষা \উদ্ধৃত করার জন্য ব্যবহার করে, আপনি এস্কেপ সিনট্যাক্স থেকে বেরিয়ে আসুন (ডাবল-পলায়ন - একবার ভাষা / প্ল্যাটফর্মের জন্য, একবার নিজেই JSON এর জন্য):

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

3

JSON ক্ষেত্রের মান লেখার সময় আপনি সার্ভারে আপনার স্ট্রিংটি এড়াতে এবং উদাহরণস্বরূপ ক্লায়েন্ট ব্রাউজারে মানটি পুনরুদ্ধার করার সময় এটি আনসেকেপ করতে পারেন।

সমস্ত বড় ব্রাউজারের জাভাস্ক্রিপ্ট প্রয়োগের আনসকেপ কমান্ড রয়েছে।

উদাহরণ:

সার্ভারে:

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

ব্রাউজারে:

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

2

আপনি স্ট্রিং থেকে বাঁচতে এই সি # ফাংশনটি সন্ধান করতে পারেন:

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(); 
} 

3
কেন এই পালাবেন >?
অযৌক্তিকভাবে

0

আমি এই ফাংশনটি 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']);

9
বেশিরভাগ ভাষায় আপনার নিজের ম্যাপিং ফাংশনটি লেখার চেয়ে ইউনিকোড স্ট্রিং থেকে অ্যাকসেন্টগুলি ছাঁটাই করার আরও ভাল উপায় রয়েছে। অজগর উদাহরণের জন্য এই প্রশ্নটি দেখুন: stackoverflow.com/questions/517923/…
MiniQuark

হ্যাঁ, আমাদের আলাদা আলাদা ভাষায় বিশেষ অক্ষর নিয়ন্ত্রণ করার অনেক উপায় রয়েছে।
শিবরাজআরএইচ

2
এগুলি সাধারণভাবে ছিনিয়ে নেওয়া সমস্ত ধরণের খারাপ। এক্সএমএল সংখ্যার অক্ষর রেফারেন্স হিসাবে তাদের এনকোড করা ভাল এবং তারপরে শেষ পাওয়ার পরে ডিকোড করুন।
অ্যানারিফেক

0

JSON.stringify

JSON.stringify(`{ 
  a:"a"
}`)

উপরের স্ট্রিং এ রূপান্তর করা হবে

"{ \n      a:\"a\"\n    }"

এখানে উল্লিখিত হিসাবে

json স্ট্রিংফাই

এই ফাংশনটি ইনপুট স্ট্রিংয়ের শুরু এবং শেষে ডাবল উক্তি যুক্ত করে এবং বিশেষ জেএসএন অক্ষরগুলি থেকে পালিয়ে যায়। বিশেষত, একটি নিউলাইন replaced n অক্ষর দ্বারা প্রতিস্থাপিত হয়, একটি ট্যাব replaced t অক্ষর দ্বারা প্রতিস্থাপিত হয়, একটি ব্যাকস্ল্যাশ দুটি ব্যাকস্ল্যাশ by দ্বারা প্রতিস্থাপিত হয়, এবং প্রতিটি উদ্ধৃতি চিহ্নের আগে একটি ব্যাকস্ল্যাশ স্থাপন করা হয়।


4
এটি আটটি বিদ্যমান উত্তর সহ একাদশ বছরের পুরানো প্রশ্নের একমাত্র উত্তর। কোডটি ব্যাখ্যা করার জন্য, এবং আপনার উত্তরগুলির প্রশ্নের কী কী নতুন দিক রয়েছে তা ব্যাখ্যা করার জন্যও যদি দরকারী সময় হয় এবং নতুন সংস্করণ প্রকাশ করা আপনার উত্তরকে প্রভাবিত করে তবে এটি দরকারী।
জেসন অ্যালার

-1

Json_encode (পিএইচপি 5 এ উপলব্ধ) অনুকরণ করতে পিএইচপি 4 এ ক্লাস করার সময় আমি এই সমস্যার মুখোমুখি হয়েছি। আমি এখানে যা এলাম তা এখানে:

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

আমি এখানে উল্লিখিত বিধিগুলি অনুসরণ করেছি । আমি কেবল আমার যা প্রয়োজন তা ব্যবহার করেছি তবে আমি অনুভব করেছি যে আপনি এটি যে ভাষা ব্যবহার করছেন তা আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিতে পারেন। আমার ক্ষেত্রে সমস্যাটি নিউ লাইনগুলি সম্পর্কে ছিল না কারণ আমি প্রাথমিকভাবে ভেবেছিলাম, তবে / অব্যাহতিপ্রাপ্ত হওয়ার বিষয়ে নয়। আমি আশা করি যে আমার ভুলটি আমি আবিষ্কার করেছিলাম তার সামান্য মাথাব্যথা থেকে এটি অন্য কাউকে প্রতিরোধ করেছিল।


2
Json.org- এ উল্লিখিত নিয়ন্ত্রণ অক্ষরের 6 টি শর্টহ্যান্ডগুলি সমস্ত নিয়ন্ত্রণের অক্ষরের একটি সম্পূর্ণ তালিকা নয়। ফলস্বরূপ, এই ফাংশনটি অবৈধ JSON তৈরি করতে পারে।
ফিল

-5

আমি যেমন আপনার প্রশ্নটি বুঝতে পেরেছি, এটি জেএসএনকে পার্স করার বিষয়ে নয় কারণ আপনি আপনার কোডটিতে আপনার জেএসনকে সরাসরি কপি-পেস্ট করতে পারেন - সুতরাং যদি এটি হয় তবে আপনার জেএসওএনকে কেবল dataObjএকক উদ্ধৃতি (মোড়ক eval==evil) দিয়ে মোড়ানো না করে পরিবর্তনশীলটিতে সরাসরি অনুলিপি করুন t

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

console.log(dataObj);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.