Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检查它是否';是字符串还是json_Javascript_Jquery_Json - Fatal编程技术网

Javascript 如何检查它是否';是字符串还是json

Javascript 如何检查它是否';是字符串还是json,javascript,jquery,json,Javascript,Jquery,Json,我有一个json字符串,它由json.Stringify函数从object转换而来 我想知道它是json字符串还是普通字符串 有没有像“isJson()”这样的函数来检查它是否是json 我希望在使用本地存储时使用该函数,如下面的代码所示 提前谢谢你 var Storage = function(){} Storage.prototype = { setStorage: function(key, data){ if(typeof data == 'object'){

我有一个json字符串,它由json.Stringify函数从object转换而来

我想知道它是json字符串还是普通字符串

有没有像“isJson()”这样的函数来检查它是否是json

我希望在使用本地存储时使用该函数,如下面的代码所示

提前谢谢你

var Storage = function(){}

Storage.prototype = {

  setStorage: function(key, data){

    if(typeof data == 'object'){

      data = JSON.stringify(data);
      localStorage.setItem(key, data);     

    } else {
      localStorage.setItem(key, data);
    }

  },


  getStorage: function(key){

    var data = localStorage.getItem(key);

    if(isJson(data){ // is there any function to check if the argument is json or string?

      data = JSON.parse(data);
      return data;

    } else {

      return data;
    }

  }

}

var storage = new Storage();

storage.setStorage('test', {x:'x', y:'y'});

console.log(storage.getStorage('test'));

您可以使用
JSON.parse
轻松创建一个。当它收到一个无效的JSON字符串时,它抛出一个异常

function isJSON(data) {
   var ret = true;
   try {
      JSON.parse(data);
   }catch(e) {
      ret = false;
   }
   return ret;
}
“简单”的方法是
尝试
解析并在失败时返回未解析的字符串:

var data = localStorage[key];
try {return JSON.parse(data);}
catch(e) {return data;}

在另一个帖子里找到这个

因为问题是“如何检查它是字符串还是json”,可能一个简单的方法就是检查字符串,所以您应该在某个地方执行类似的操作:

    if (typeof data === 'string') { // check for string!
      //... do something
    } else {///... do something else}


根据您的总体解决方案,这可能足够了,以防其他人四处查看。

我认为同时返回解析的JSON是个好主意,因此我更喜欢以下版本:

function tryParse(str) {
    try {
        return { value: JSON.parse(str), isValid: true }
    } catch (e) {
        return { value: str, isValid: false }
    }
}
function tryParse(str) {
    try {
        var parsed = JSON.parse(str);
        return { value: parsed , isValid: typeof parsed === 'object'}
    } catch (e) {
        return { value: str, isValid: false }
    }
}
正如您可能知道的,
JSON.parse(“1234”)
JSON.parse(“0”)
JSON.parse(“false”)
JSON.parse(“null”)
不会引发异常并返回true。所有这些值都是有效的JSON,但如果您想看到
isValid
is
true
仅适用于对象(例如:
{key:“value”}
)和数组(例如:
[{“key:“value”}]
),则可以使用以下版本:

function tryParse(str) {
    try {
        return { value: JSON.parse(str), isValid: true }
    } catch (e) {
        return { value: str, isValid: false }
    }
}
function tryParse(str) {
    try {
        var parsed = JSON.parse(str);
        return { value: parsed , isValid: typeof parsed === 'object'}
    } catch (e) {
        return { value: str, isValid: false }
    }
}

没有这样的方法。然而,
typeof
是处理这种情况的正确而有效的方法。var isjson=false;试试{JSON.parse(str);isjson=true;}catch(y){}我猜你是说down?那好吧。编辑:在你提问之前,你得到了一个向上投票。
1234
0
false
null
都是无效的JSON,它们是布尔值和null值,它们隐式转换为字符串。由于这种隐式转换,这些值会导致这些字符串
“1234”
“0”
“false”
“null”
,这些字符串实际上是有效的JSON。这与使用
var test={toString(){return 1}}相同;console.log(JSON.parse(test))
,这也可以被解析并导致
1
,但这不会使
test
成为有效的JSON。对于这种用例,您需要更多的代码,这不能用4行简单的代码来完成,我想我们这里讨论的是常规用法,而不是
{toString(){return 1}
JSON.parse(1234)
1234
不是JSON,而是一个数字。该数字在
JSON.parse
函数中隐式转换为字符串,但这不会改变
1234
不是JSON的事实。我添加了
{toString(){return 1}}
以使其更清晰,因为对于
JSON.parse({toString(){return 1}})
来说,内部发生的事情与
JSON.parse(1234)
都隐式转换为有效的JSON字符串,但是当它们被传递到
JSON.parse
时,它们都不是JSON。我编辑了我的答案,你的意思是
1234
是有效的JSON,但
1234
不是?完全正确。现在它是正确的。如果您有
var a=1
和var
var b=“1”
,那么
a的类型是
number
,而
b的类型是
string
,则
a
b
都可以传递到
JSON。解析
会得到
1
,但在这种情况下只有
b
是JSON,因为它是数字
1
的一种基于字符串的表示形式。对于数字例如:JSON.parse(1)=1,上面的方法失败了,但是对于字符串来说,依赖异常控制流并不是一种好的做法。