Javascript 如何检查它是否';是字符串还是json
我有一个json字符串,它由json.Stringify函数从object转换而来 我想知道它是json字符串还是普通字符串 有没有像“isJson()”这样的函数来检查它是否是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'){
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
istrue
仅适用于对象(例如:{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
和varvar b=“1”
,那么a的类型是number
,而b的类型是string
,则a
和b
都可以传递到JSON。解析会得到1
,但在这种情况下只有b
是JSON,因为它是数字1
的一种基于字符串的表示形式。对于数字例如:JSON.parse(1)=1,上面的方法失败了,但是对于字符串来说,依赖异常控制流并不是一种好的做法。