জাভাস্ক্রিপ্ট অবজেক্টটি JSON কিনা তা কীভাবে পরীক্ষা করবেন


91

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

আমি ব্যবহার করার চেষ্টা করেছি typeofএবং instanceofউভয়ই কাজ করছে বলে মনে হচ্ছে না, যেমনটি typeofJSON অবজেক্ট এবং অ্যারে উভয়ের জন্য কোনও বস্তু ফিরে আসবে এবং instanceofআমি যখন করি তখন একটি ত্রুটি দেয় obj instanceof JSON

আরও সুনির্দিষ্টভাবে বলতে গেলে, জেএসএনকে কোনও জেএস অবজেক্টে পার্স করার পরে, আমি কোনও সাধারণ স্ট্রিং, বা কী এবং মানগুলির সাথে একটি বস্তু (একটি জেএসএন বস্তু থেকে), বা একটি অ্যারে (জেএসএন অ্যারে থেকে) যাচাই করতে পারি কিনা এমন কোনও উপায় আছে কি? )?

উদাহরণ স্বরূপ:

জেএসওএন

var data = "{'hi':
             {'hello':
               ['hi1','hi2']
             },
            'hey':'words'
           }";

নমুনা জাভাস্ক্রিপ্ট

var jsonObj = JSON.parse(data);
var path = ["hi","hello"];

function check(jsonObj, path) {
    var parent = jsonObj;
    for (var i = 0; i < path.length-1; i++) {
        var key = path[i];
        if (parent != undefined) {
            parent = parent[key];
        }
    }
    if (parent != undefined) {
        var endLength = path.length - 1;
        var child = parent[path[endLength]];
        //if child is a string, add some text
        //if child is an object, edit the key/value
        //if child is an array, add a new element
        //if child does not exist, add a new key/value
    }
}

উপরের মত আমি কীভাবে অবজেক্ট চেকিং করব?


4
জেএসএন হ'ল একটি স্ট্রিং হিসাবে সঞ্চিত একটি স্বরলিপি । আপনি কি নিশ্চিত যে আপনি বিভ্রান্তিকর পদগুলি নিচ্ছেন না?
zerkms

নাহ, আমি আরও পরিষ্কার করে তুলতে প্রশ্নটি আপডেট করেছি। আমার অনুমান আমার মূল প্রশ্নটি হ'ল আমরা .parse()JSON স্ট্রিংয়ের পরে কী ঘটে এবং এটি কীভাবে চিহ্নিত করব?
ওয়েই হাও

4
পরিবর্তন এটিকে আরও স্পষ্ট করে তুলেছে না (আমার জন্য লীজে)। আপনি যদি JSON এর সাথে উদাহরণ দিচ্ছেন তবে আপনি কী করছেন
zerkms

একটি উদাহরণ সহ আপডেট প্রশ্ন। (:
ওয়েই হাও

আসল প্রশ্নটি: আপনি যত্ন কেন?
আশেরাহ

উত্তর:


130

আমি কনস্ট্রাক্টর অ্যাট্রিবিউট চেক করব।

যেমন

var stringConstructor = "test".constructor;
var arrayConstructor = [].constructor;
var objectConstructor = ({}).constructor;

function whatIsIt(object) {
    if (object === null) {
        return "null";
    }
    if (object === undefined) {
        return "undefined";
    }
    if (object.constructor === stringConstructor) {
        return "String";
    }
    if (object.constructor === arrayConstructor) {
        return "Array";
    }
    if (object.constructor === objectConstructor) {
        return "Object";
    }
    {
        return "don't know";
    }
}

var testSubjects = ["string", [1,2,3], {foo: "bar"}, 4];

for (var i=0, len = testSubjects.length; i < len; i++) {
    alert(whatIsIt(testSubjects[i]));
}

সম্পাদনা করুন: একটি নাল চেক এবং একটি সংজ্ঞায়িত চেক যুক্ত করা হয়েছে।


9
else ifঅপ্রয়োজনীয়
ম্যাকসোনক

এটি উদাহরণস্বরূপ ব্যবহারের মতো নয়? বিকাশকারী.মোজিলা.আর.সি.পি.আরবিআর
পেরেইরা

@ পেরিরা: জাভাস্ক্রিপ্টে কিছু বিভ্রান্তিকর ঝকঝকে রয়েছে। স্ট্রিংয়ের "অবশ্যই_তিনি_এই_এ_স্ট্রিং" উদাহরণটি চেষ্টা করুন।
প্রোগ্রামিং গাই

{}.constructorআমাকে ERROR TypeError: Cannot read property 'constructor' of undefinedআমার কৌনিক প্রয়োগে আনতে বাধ্য করছে ।
কাবাব-কেস

4
অনেক ifবিবৃতি ... একটি ব্যবহার করুন switch!
Nanoo

26

অ্যারে পরীক্ষা করার জন্য আপনি অ্যারে.আইসআর্রে ব্যবহার করতে পারেন । তারপরে অবজেক্ট টাইপ করুন == 'স্ট্রিং' এবং টাইপফজেজ == 'অবজেক্ট'

var s = 'a string', a = [], o = {}, i = 5;
function getType(p) {
    if (Array.isArray(p)) return 'array';
    else if (typeof p == 'string') return 'string';
    else if (p != null && typeof p == 'object') return 'object';
    else return 'other';
}
console.log("'s' is " + getType(s));
console.log("'a' is " + getType(a));
console.log("'o' is " + getType(o));
console.log("'i' is " + getType(i));

's' স্ট্রিং করছে
'এ' অ্যারে হ'ল
'ও' অবজেক্ট
'আই' অন্যটি


4
অ্যাকাউন্টে নিতে ভুলবেন নাtypeof null === 'object'
hugomg

[{ "name":[ {"key": "any key" } ] }] এটি বৈধ জসনও তবে আপনার কোড অনুসারে এর রিটার্ন অ্যারে। এটিকে দেখুন - মৃগু
সুধীর কে গুপ্ত

17

একটি JSON বস্তু হল একটি বস্তুর। কোনও প্রকারটি কোনও অবজেক্টের ধরণ কিনা তা পরীক্ষা করতে কনস্ট্রাক্টর সম্পত্তিটি মূল্যায়ন করুন।

function isObject(obj)
{
    return obj !== undefined && obj !== null && obj.constructor == Object;
}

অন্যান্য সমস্ত ধরণের ক্ষেত্রে একই প্রযোজ্য:

function isArray(obj)
{
    return obj !== undefined && obj !== null && obj.constructor == Array;
}

function isBoolean(obj)
{
    return obj !== undefined && obj !== null && obj.constructor == Boolean;
}

function isFunction(obj)
{
    return obj !== undefined && obj !== null && obj.constructor == Function;
}

function isNumber(obj)
{
    return obj !== undefined && obj !== null && obj.constructor == Number;
}

function isString(obj)
{
    return obj !== undefined && obj !== null && obj.constructor == String;
}

function isInstanced(obj)
{
    if(obj === undefined || obj === null) { return false; }

    if(isArray(obj)) { return false; }
    if(isBoolean(obj)) { return false; }
    if(isFunction(obj)) { return false; }
    if(isNumber(obj)) { return false; }
    if(isObject(obj)) { return false; }
    if(isString(obj)) { return false; }

    return true;
}

4
জেএসএন এনকোডেড সংস্থান কোনও অবজেক্ট নয়। এটি একটি স্ট্রিং। আপনি এটিকে জাভাস্ক্রিপ্টে ডিকোড করার পরে কেবল JSON.parse()এটি JSON রিসোর্সই কোনও অবজেক্টে পরিণত হয়। অতএব আপনি যদি সার্ভার থেকে আসা কোনও সংস্থানটি যদি এটি JSON কিনা তা পরীক্ষা করেন তবে স্ট্রিংয়ের জন্য প্রথমে চেক করা ভাল, তারপরে যদি এটি একটি হয় না <empty string>এবং তারপরে এটি কোনও বস্তু হিসাবে পার্সিংয়ের পরে।
Hmerman6006

8

আপনি যদি objectকোনও JSONস্ট্রিং পার্স করার পরে যদি কোনও প্রকারটি পরীক্ষা করার চেষ্টা করছেন তবে আমি কনস্ট্রাক্টর বৈশিষ্ট্যটি পরীক্ষা করার পরামর্শ দিচ্ছি:

obj.constructor == Array || obj.constructor == String || obj.constructor == Object

এটি টাইপফ বা উদাহরণের চেয়ে অনেক দ্রুত চেক হবে।

যদি কোনও জেএসওএন লাইব্রেরি এই ফাংশনগুলির সাহায্যে নির্মিত বস্তুগুলি না ফেরায় তবে আমি এটির জন্য খুব সন্দেহজনক।


আরও অনেক প্রত্যক্ষ পন্থা। ধন্যবাদ! = ডি
এডুয়ার্ডো লুসিও

পছন্দের উত্তর। আপনি কোথা থেকে পারফরম্যান্স বেনিফিট তথ্য পাবেন?
ড্যানিয়েল এফ

@ ড্যানিয়েলফ '12 এ ফিরে আসা সাধারণ জ্ঞান ছিল, এখন সব কিছু আলাদা so তাই আমি জানি না যে এটি ধারণ করে
জোশরাগেম

5

আপনি JSON পার্সিংয়ের জন্য আপনার নিজের নির্মাতা তৈরি করতে পারেন:

var JSONObj = function(obj) { $.extend(this, JSON.parse(obj)); }
var test = new JSONObj('{"a": "apple"}');
//{a: "apple"}

তারপরে এটির প্রাথমিকভাবে পার্সিংয়ের প্রয়োজন কিনা তা পরীক্ষা করে দেখুন

test instanceof JSONObj

5

@ পিটারউইলকিনসনের উত্তর আমার পক্ষে কাজ করেনি কারণ "টাইপড" অবজেক্টের জন্য কনস্ট্রাক্টর সেই অবজেক্টের নামে কাস্টমাইজ করা হয়েছে। টাইপফের সাথে আমাকে কাজ করতে হয়েছিল

function isJson(obj) {
    var t = typeof obj;
    return ['boolean', 'number', 'string', 'symbol', 'function'].indexOf(t) == -1;
}

4

এই সমস্যাটি সমাধান করার জন্য আমি একটি এনপিএম মডিউল লিখেছিলাম। এটি এখানে উপলব্ধ :

object-types: আক্ষরিক ধরণের কী অন্তর্নিহিত জিনিসগুলি সন্ধানের জন্য একটি মডিউল

ইনস্টল করুন

  npm install --save object-types


ব্যবহার

const objectTypes = require('object-types');

objectTypes({});
//=> 'object'

objectTypes([]);
//=> 'array'

objectTypes(new Object(true));
//=> 'boolean'

একবার দেখুন, এটি আপনার সঠিক সমস্যাটি সমাধান করা উচিত। যদি আপনার কোন প্রশ্ন থাকে তাহলে আমার জানতে দিন! https://github.com/dawsonbotsford/object-tyype


2

আপনি ডেটা বিশ্লেষণ করার চেষ্টা করতে পারেন এবং তারপরে আপনার কোনও আপত্তি এসেছে কিনা তা পরীক্ষা করতে পারেন:

var testIfJson = JSON.parse(data);
if (typeOf testIfJson == "object")
{
//Json
}
else
{
//Not Json
}

2

আমি টাইপফ অপারেটরকে কনস্ট্রাক্টর অ্যাট্রিবিউট (পিটার দ্বারা) এর একটি চেকের সাথে একত্রিত করি:

var typeOf = function(object) {
    var firstShot = typeof object;
    if (firstShot !== 'object') {
        return firstShot;
    } 
    else if (object.constructor === [].constructor) {
        return 'array';
    }
    else if (object.constructor === {}.constructor) {
        return 'object';
    }
    else if (object === null) {
        return 'null';
    }
    else {
        return 'don\'t know';
    } 
}

// Test
var testSubjects = [true, false, 1, 2.3, 'string', [4,5,6], {foo: 'bar'}, null, undefined];

console.log(['typeOf()', 'input parameter'].join('\t'))
console.log(new Array(28).join('-'));
testSubjects.map(function(testSubject){
    console.log([typeOf(testSubject), JSON.stringify(testSubject)].join('\t\t'));
});

ফলাফল:

typeOf()    input parameter
---------------------------
boolean     true
boolean     false
number      1
number      2.3
string      "string"
array       [4,5,6]
object      {"foo":"bar"}
null        null
undefined       

2

কেন নম্বর চেক করবেন না - কিছুটা খাটো এবং আইই / ক্রোম / এফএফ / নোড.জেজে কাজ করে

function whatIsIt(object) {
    if (object === null) {
        return "null";
    }
    else if (object === undefined) {
        return "undefined";
    }
    if (object.constructor.name) {
            return object.constructor.name;
    }
    else { // last chance 4 IE: "\nfunction Number() {\n    [native code]\n}\n" / node.js: "function String() { [native code] }"
        var name = object.constructor.toString().split(' ');
        if (name && name.length > 1) {
            name = name[1];
            return name.substr(0, name.indexOf('('));
        }
        else { // unreachable now(?)
            return "don't know";
        }
    }
}

var testSubjects = ["string", [1,2,3], {foo: "bar"}, 4];
// Test all options
console.log(whatIsIt(null));
console.log(whatIsIt());
for (var i=0, len = testSubjects.length; i < len; i++) {
    console.log(whatIsIt(testSubjects[i]));
}


2

আমি জানি এটি ভাল উত্তর সহ খুব পুরানো প্রশ্ন। তবে, মনে হচ্ছে এটি এখনও আমার 2 add যুক্ত করা সম্ভব।

ধরে নিই যে আপনি নিজে JSON অবজেক্ট নয়, একটি স্ট্রিং যা JSON হিসাবে ফরম্যাট করেছেন (যা আপনার ক্ষেত্রে মনে হয় var data) পরীক্ষা করার চেষ্টা করছেন , আপনি নীচের ফাংশনটি ব্যবহার করতে পারেন যা বুলিয়ান দেয় (যা হয় বা এটি নয় ') জেএসএন '):

function isJsonString( jsonString ) {

  // This function below ('printError') can be used to print details about the error, if any.
  // Please, refer to the original article (see the end of this post)
  // for more details. I suppressed details to keep the code clean.
  //
  let printError = function(error, explicit) {
  console.log(`[${explicit ? 'EXPLICIT' : 'INEXPLICIT'}] ${error.name}: ${error.message}`);
  }


  try {
      JSON.parse( jsonString );
      return true; // It's a valid JSON format
  } catch (e) {
      return false; // It's not a valid JSON format
  }

}

উপরে ফাংশনটি ব্যবহার করার কয়েকটি উদাহরণ এখানে দেওয়া হয়েছে:

console.log('\n1 -----------------');
let j = "abc";
console.log( j, isJsonString(j) );

console.log('\n2 -----------------');
j = `{"abc": "def"}`;
console.log( j, isJsonString(j) );

console.log('\n3 -----------------');
j = '{"abc": "def}';
console.log( j, isJsonString(j) );

console.log('\n4 -----------------');
j = '{}';
console.log( j, isJsonString(j) );

console.log('\n5 -----------------');
j = '[{}]';
console.log( j, isJsonString(j) );

console.log('\n6 -----------------');
j = '[{},]';
console.log( j, isJsonString(j) );

console.log('\n7 -----------------');
j = '[{"a":1, "b":   2}, {"c":3}]';
console.log( j, isJsonString(j) );

আপনি যখন উপরের কোডটি চালাবেন, আপনি নিম্নলিখিত ফলাফলগুলি পাবেন:

1 -----------------
abc false

2 -----------------
{"abc": "def"} true

3 -----------------
{"abc": "def} false

4 -----------------
{} true

5 -----------------
[{}] true

6 -----------------
[{},] false

7 -----------------
[{"a":1, "b":   2}, {"c":3}] true

দয়া করে নীচের স্নিপেটটি ব্যবহার করে দেখুন এবং এটি আপনার পক্ষে কাজ করে কিনা তা আমাদের জানান। :)

গুরুত্বপূর্ণ: এই পোস্টে উপস্থাপিত ফাংশনটি https://airbrake.io/blog/javascript-error-handling/syntaxerror-json-parse-bad-parsing থেকে রূপান্তর করা হয়েছিল যেখানে আপনি JSON.parse সম্পর্কে আরও আকর্ষণীয় এবং বিশদ বিবরণ পেতে পারেন ( ) ফাংশন।

function isJsonString( jsonString ) {

  let printError = function(error, explicit) {
  console.log(`[${explicit ? 'EXPLICIT' : 'INEXPLICIT'}] ${error.name}: ${error.message}`);
  }


  try {
      JSON.parse( jsonString );
      return true; // It's a valid JSON format
  } catch (e) {
      return false; // It's not a valid JSON format
  }

}


console.log('\n1 -----------------');
let j = "abc";
console.log( j, isJsonString(j) );

console.log('\n2 -----------------');
j = `{"abc": "def"}`;
console.log( j, isJsonString(j) );

console.log('\n3 -----------------');
j = '{"abc": "def}';
console.log( j, isJsonString(j) );

console.log('\n4 -----------------');
j = '{}';
console.log( j, isJsonString(j) );

console.log('\n5 -----------------');
j = '[{}]';
console.log( j, isJsonString(j) );

console.log('\n6 -----------------');
j = '[{},]';
console.log( j, isJsonString(j) );

console.log('\n7 -----------------');
j = '[{"a":1, "b":   2}, {"c":3}]';
console.log( j, isJsonString(j) );


1

এটা চেষ্টা কর

if ( typeof is_json != "function" )
function is_json( _obj )
{
    var _has_keys = 0 ;
    for( var _pr in _obj )
    {
        if ( _obj.hasOwnProperty( _pr ) && !( /^\d+$/.test( _pr ) ) )
        {
           _has_keys = 1 ;
           break ;
        }
    }

    return ( _has_keys && _obj.constructor == Object && _obj.constructor != Array ) ? 1 : 0 ;
}

এটি নীচের উদাহরণের জন্য কাজ করে

var _a = { "name" : "me",
       "surname" : "I",
       "nickname" : {
                      "first" : "wow",
                      "second" : "super",
                      "morelevel" : {
                                      "3level1" : 1,
                                      "3level2" : 2,
                                      "3level3" : 3
                                    }
                    }
     } ;

var _b = [ "name", "surname", "nickname" ] ;
var _c = "abcdefg" ;

console.log( is_json( _a ) );
console.log( is_json( _b ) );
console.log( is_json( _c ) );

0

অতিরিক্ত চেক সহ পিটারের উত্তর! অবশ্যই, 100% গ্যারান্টিযুক্ত নয়!

var isJson = false;
outPutValue = ""
var objectConstructor = {}.constructor;
if(jsonToCheck.constructor === objectConstructor){
    outPutValue = JSON.stringify(jsonToCheck);
    try{
            JSON.parse(outPutValue);
            isJson = true;
    }catch(err){
            isJson = false;
    }
}

if(isJson){
    alert("Is json |" + JSON.stringify(jsonToCheck) + "|");
}else{
    alert("Is other!");
}

0

@ মার্টিন ওয়ানটেক উত্তরের ভিত্তিতে, তবে কিছু প্রস্তাবিত উন্নতি / সমন্বয় সহ ...

// NOTE: Check JavaScript type. By Questor
function getJSType(valToChk) {

    function isUndefined(valToChk) { return valToChk === undefined; }
    function isNull(valToChk) { return valToChk === null; }
    function isArray(valToChk) { return valToChk.constructor == Array; }
    function isBoolean(valToChk) { return valToChk.constructor == Boolean; }
    function isFunction(valToChk) { return valToChk.constructor == Function; }
    function isNumber(valToChk) { return valToChk.constructor == Number; }
    function isString(valToChk) { return valToChk.constructor == String; }
    function isObject(valToChk) { return valToChk.constructor == Object; }

    if(isUndefined(valToChk)) { return "undefined"; }
    if(isNull(valToChk)) { return "null"; }
    if(isArray(valToChk)) { return "array"; }
    if(isBoolean(valToChk)) { return "boolean"; }
    if(isFunction(valToChk)) { return "function"; }
    if(isNumber(valToChk)) { return "number"; }
    if(isString(valToChk)) { return "string"; }
    if(isObject(valToChk)) { return "object"; }

}

দ্রষ্টব্য: আমি এই পদ্ধতিটি খুব যুক্তিযুক্ত বলে মনে করেছি, তাই আমি এই উত্তরটি জমা দিয়েছি।


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