JSON.stringify প্রোপার্টিতে কোট ছাড়াই?


98

আমি এমন একটি পরিষেবা ব্যবহার করছি যা ভুল JSON ফর্ম্যাট ব্যবহার করে (বৈশিষ্ট্যের চারপাশে কোনও ডাবল উদ্ধৃতি নেই)। সুতরাং আমি প্রেরণ করা প্রয়োজন

{ name: "John Smith" } পরিবর্তে { "name": "John Smith" }

এটি আমার পরিষেবা না হওয়ায় এই ফর্ম্যাটটি পরিবর্তন করা যাবে না।

উপরের মতো একটি জাভাস্ক্রিপ্ট অবজেক্টটি ফর্ম্যাট করতে স্ট্রিংফাই রাউটিং সম্পর্কে যে কেউ জানেন?

উত্তর:


118

এই সাধারণ নিয়মিত অভিব্যক্তি সমাধান বেশিরভাগ ক্ষেত্রে JSON সম্পত্তি নামগুলি উদ্ধৃত করতে কাজ করে:

const object = { name: 'John Smith' };
const json = JSON.stringify(object);  // {"name":"John Smith"}
console.log(json);
const unquoted = json.replace(/"([^"]+)":/g, '$1:');
console.log(unquoted);  // {name:"John Smith"}

চরম মামলা:

var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF");  // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'

এটি ঠিক করার জন্য রব ডব্লু কে বিশেষ ধন্যবাদ।

সীমাবদ্ধতা

সাধারণ ক্ষেত্রে পূর্বোক্ত রেজিএক্সপেক্ট কাজ করবে, তবে গাণিতিকভাবে JSON ফর্ম্যাটটি নিয়মিত অভিব্যক্তি দিয়ে বর্ণনা করা অসম্ভব যে এটি প্রতিটি একক ক্ষেত্রে কাজ করবে (একই সংখ্যক কোঁকড়ানো বন্ধনী গণনা regexp সহ অসম্ভব।) সুতরাং, আমার কাছে দেশীয় ফাংশনের মাধ্যমে আনুষ্ঠানিকভাবে JSON স্ট্রিংকে বিশ্লেষণ করে উদ্ধৃতিগুলি সরানোর জন্য একটি নতুন ফাংশন তৈরি করুন:

function stringify(obj_from_json) {
    if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
        // not an object, stringify using native function
        return JSON.stringify(obj_from_json);
    }
    // Implements recursive object serialization according to JSON spec
    // but without quotes around the keys.
    let props = Object
        .keys(obj_from_json)
        .map(key => `${key}:${stringify(obj_from_json[key])}`)
        .join(",");
    return `{${props}}`;
}

উদাহরণ: https://jsfiddle.net/DerekL/mssybp3k/


4
-1 আমিও নই, তবে আপনাকে অবশ্যই মনোযোগ দিয়ে প্রশ্নটি পড়তে হবে। ওপিকে কোনও বস্তুকে (ভাঙা) জসনের কাছে এনকোড করা দরকার, এটি বিশ্লেষণ / মূল্যায়ন নয়।
সালমান এ

7
@ ডেরেক এই পদ্ধতিটি নির্ভরযোগ্য নয় । উদাহরণস্বরূপ, এই ইনপুটটি নিন: {"foo":"e\":bar"}(বৈধ জেএসএন) হয়ে যায় {foo:e:bar"}(...)!
রব ডাব্লু

4
@ ডেরেক /\\\"/এটিকে সরল করা যায় /\\"/। গ্লোবাল পতাকা যুক্ত করতে ভুলবেন না /\\"/g, বা এটি একাধিকের সাথে স্ট্রিংগুলিতে ভেঙে যাবে \"। এলোমেলো চরিত্র হিসাবে, সম্পাদক চাপে থাকলেও কখনও কোনও আক্ষরিক ইউ + এফএফএফএফ ব্যবহার করবেন না , তবে একটি পালানোর ক্রম। উল্টানোর জন্য রেজেক্স হয়ে উঠত /\uFFFF/g
রব ডব্লু

4
@ ডেরেক 朕 會 功夫 আপনার রেজিেক্স /\"([^(\")"]+)\":/gএটিকে সহজতর করা যেতে পারে /"([^"]+)":/g, দেখুন regex101.com/r/qnz0ld/2
tanguy_k

4
@endriu সেক্ষেত্রে নাল মানগুলির জন্য একটি অতিরিক্ত চেক যুক্ত করুন।
ডেরেক 朕 會 功夫

18

দেখে মনে হচ্ছে এটি একটি সাধারণ অবজেক্ট টু স্ট্রিং পদ্ধতি যা আপনি সন্ধান করছেন।

নোড.জেজে এটি ইউজ অবজেক্টটি ব্যবহার করে এবং Use.inspect (আপনারঅজেক্ট) কল করে সমাধান করা হবে। এটি আপনাকে যা চায় তা দেবে। পদ্ধতির প্রয়োগের গভীরতা সহ আরও বিকল্পের জন্য এই লিঙ্কটি অনুসরণ করুন। http://nodejs.org/api/util.html#util_util_inspect_object_options

সুতরাং, আপনি যা সন্ধান করছেন তা মূলত কোনও অবজেক্ট ইন্সপেক্টর জেএসওএন রূপান্তরকারী নয়। JSON ফর্ম্যাটটি নির্দিষ্ট করে যে সমস্ত বৈশিষ্ট্য অবশ্যই ডাবল উদ্ধৃতিতে আবদ্ধ থাকতে হবে। সুতরাং আপনি যা চান তা করতে JSON রূপান্তরকারী থাকবে না কারণ এটি কেবল JSON ফর্ম্যাট নয় p স্পেস এখানে: https://developer.mozilla.org/en-US/docs/Using_native_JSON

আপনার সার্ভারের ভাষার উপর নির্ভর করে আপনার প্রয়োজনীয় স্ট্রিং বা পরিদর্শন করতে আপত্তি।


4
আপনাকে অনেক ধন্যবাদ! আমি ঠিক এটিই খুঁজছিলাম। আমি আমার গেমসে ডাব্লুএস সার্ভার জুড়ে ডেটা নিঃসরণ করতে জেসন ব্যবহার করি এবং এটি বিশ্বাস করি বা না, সম্পত্তি নামের চারপাশে অতিরিক্ত উদ্ধৃতি চিহ্নগুলি মোকাবেলা না করে এক বিশাল পরিমাণে ডেটা সাশ্রয় করে! কেবল পরিষ্কার করার জন্য, .toSource()নোডেজের মধ্যেও সূক্ষ্মভাবে কাজ করে, তবে অ্যারেগুলিতে অবজেক্টগুলি কাজ করে না। utilঅ্যারে এবং অ্যারে যা বিস্ময়কর অবজেক্টের জন্য কাজ পরিদর্শন করা, এটা ভালবাসা।
নিকক নিউম্যান

4
util.inspect()একবারে একাধিক প্যারাম সেট করার জন্য, নিও 4 জের ক্যোয়ারীতে কোনও অবজেক্ট লিখতে গিয়ে আমার জন্য কেবল দুর্দান্ত কাজ করেছিলেন।
agm1984

4
নোডেজ লিঙ্ক থেকে:> ইউজ.ইনস্পেক্ট () পদ্ধতিটি ডিবাগিংয়ের উদ্দেশ্যে অবজেক্টের একটি স্ট্রিং প্রতিনিধিত্ব করে। Use.inspect এর আউটপুট যে কোনও সময় পরিবর্তিত হতে পারে এবং প্রোগ্রামের ভিত্তিতে নির্ভর করা উচিত নয়।
পিটার রোহলেন

5

আপনি JSON ফর্ম্যাটটি সংজ্ঞায়িত করেছেন এমন একটি দ্বারা তৈরি করা পার্সারের উত্স কোডটি দেখতে পারেন । খোঁজাjson2.js quote ফাংশন কল: এই উদ্ধৃতি দ্বারা একটি মান ঘিরে। কীগুলি 326 এবং 338 লাইনে উদ্ধৃত হয়েছে ।

পরিবর্তনের পরে গ্রন্থাগারটি অন্তর্ভুক্ত করবেন না। পরিবর্তে কেবল প্রাসঙ্গিক ( stringify) অংশ নিন, বা কমপক্ষে JSONঅন্য কোনও কিছু দিয়ে প্রতিস্থাপন করুন , যেমন। FAKEJSON

উদাহরণস্বরূপ, একটি অবজেক্ট FAKEJSONযা কেবলমাত্র সংজ্ঞায়িত stringify: http://jsfiddle.net/PYudw/


আপনি যখন খাঁটি জাভাস্ক্রিপ্টে এটি করতে পারেন তখন কেন আপনার অতিরিক্ত লাইব্রেরির প্রয়োজন হবে?
ডেরেক 朕 會

এটা একটা ভালো বুদ্ধি. আমি রেপো কাঁটাচামচ করব, উদ্ধৃতিগুলি মুছে ফেলব এবং জেএসওএন অবজেক্টটির নাম ফিএলজসনের মতো সুস্বাদু কিছুতে রাখব যাতে এটি স্পষ্ট হয়ে যায় যে আপনি আসল জেএসএন বস্তু বা প্রকৃত জেএসওনের সাথে কাজ করছেন না
রিচার্ড টাওয়ার্স

@ ডেরেক লাইব্রেরিটি পুরো হিসাবে অন্তর্ভুক্ত করা উচিত নয়। কেবল JSON.stringifyঅংশ নিন, এবং উদ্ধৃতিগুলি সরান। যেহেতু লাইব্রেরিটি জাসনকে সংজ্ঞায়িত করেছেন তিনিই তৈরি করেছেন , তাই আমরা নিশ্চিত হতে পারি যে ফলাফলটি খুব কার্যকর জেএসএন।
রব ডাব্লু

দেখে মনে হচ্ছে এটি সর্বোত্তম পন্থা।
ডেরেক 朕 會

হ্যাঁ, ডেরেকের সাথে একমত যদিও তার প্রতিস্থাপনকারী ভাল কাজ করে, আমি ক্রফোর্ডের কোডের সাথে আরও আত্মবিশ্বাসী বোধ করি, ডেরাক লোলকে অসম্মান করি না। .toSource()ভাল কাজ করে তবে এতে অন্তর্ভুক্ত নেই যদি আপনার বস্তুটি গুঁড়িযুক্ত অ্যারেতে থাকে (এবং আমি নোডে থাকি তাই ব্রাউজারের কম্পাট কোনও সমস্যা নয়: পি) তাই আমি এই পদ্ধতিটি ব্যবহার করব ধন্যবাদ @ রবডাব্লুও, জেফফিল লিঙ্কটি মনে হয় লোডিং পৃষ্ঠায় আটকা পড়তে হবে :(
NiCk নিউম্যান

4

JSONP এর সাথে সার্ভিভটি ব্যবহার করার চেষ্টা করুন, আমার ধারণা এই ফর্ম্যাটটি ব্যবহার করার সময় তারা এটি সরবরাহ করে offer

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

একটি দ্রুত- n-নোংরা ফিক্সটি পার্সিংয়ের আগে একটি রেজেক্সের মাধ্যমে স্ট্রিংটি পাইপ করা হতে পারে:

var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));

অথবা আপনি একটি বিদ্যমান জাভাস্ক্রিপ্ট JSON বিশ্লেষক (যেমন সমন্বয় করার চেষ্টা এই এক ) যদি আপনি একটি আরো সিনট্যাক্স পার্স চাই।



2

আপনার উত্তরাধিকারসূত্রে বাক্য গঠনটি সহজেই ওয়াইএএমএল দ্বারা খাওয়া উচিত, যা জেএসওনের সুপারস্টার।

জাভাস্ক্রিপ্ট YAML পার্সার এবং ডাম্পার ব্যবহার করে দেখুন: http://nodeca.github.com/js-yaml/


2

@ ডেরেক 朕 會 this এই পদ্ধতিটি ভাগ করে নেওয়ার জন্য ধন্যবাদ, আমি আমার কোডটি ভাগ করে নিতে চাই যা অবজেক্টগুলির একটি অ্যারেও স্ট্রিংয়েটিং সমর্থন করে।

export const stringifyObjectWithNoQuotesOnKeys = (obj_from_json) => {
    // In case of an array we'll stringify all objects.
    if (Array.isArray(obj_from_json)) {
        return `[${
                    obj_from_json
                        .map(obj => `${stringifyObjectWithNoQuotesOnKeys(obj)}`)
                        .join(",")
                }]` ;
    }
    // not an object, stringify using native function
    if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null){
        return JSON.stringify(obj_from_json);
    }
    // Implements recursive object serialization according to JSON spec
    // but without quotes around the keys.
    return `{${
            Object
                .keys(obj_from_json)
                .map(key => `${key}:${stringifyObjectWithNoQuotesOnKeys(obj_from_json[key])}`)
                .join(",")
            }}`;
};

4
আপনার JSON.stringifyতারিখের উদাহরণও ব্যবহার করা উচিত । এছাড়াও আসতে 'null'যদি obj_from_jsonনাল হয়।
দুর দিমিত্রি

4
আমি @ ফারডিমিট্রির উত্থাপিত পয়েন্টগুলি ঠিক ঠিক মতো করে দেখতে দ্বিতীয়টি পরিবর্তন করে ঠিক করেছি:if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
ব্রুনো ভোডোলা মার্টিনস

2

ব্যবহার JSON5.stringify

জেএসএন 5 হ'ল জেএসওএন- এর একটি সুপারসেট যা অনির্বাচিত সম্পত্তি কীগুলি সহ ES5 সিনট্যাক্সের অনুমতি দেয় । JSON5 রেফারেন্স বাস্তবায়ন ( json5এনপিএম প্যাকেজ ) একটি JSON5অবজেক্ট সরবরাহ করে যা অন্তর্নির্মিত হিসাবে একই আর্গ এবং শব্দার্থবিজ্ঞানের সাথে একই পদ্ধতি রয়েছেJSON অবজেক্টের ।

আপনি সম্ভবত যে পরিষেবাটি ব্যবহার করছেন এটি এই গ্রন্থাগারটি ব্যবহার করা সম্ভবত এটি সম্ভবত।


1

সিএসভিজেসনের জেএসওন বিউটিফায়ারের কাছে কীগুলিতে উদ্ধৃতি ছাড়ার বিকল্প রয়েছে। আপনি যদি কেবল কোডটি চান, আপনি এটি গিটহাব রেপো থেকে অনুলিপি করতে পারেন। এর জন্য সমর্থন যোগ করতে আমি ডগলাস ক্রকফোর্ডের জেএসএন 2 সংশোধন করেছি ।


Csvjson.com/json_beautifierসবেমাত্র ক্লিক করা হয়েছে এবং আমার প্রত্যাশার চেয়ে আলাদা একটি পৃষ্ঠা পেয়েছে ... hacked by AnoaGhost
RedactedProfile

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