我有一个json字符串,它是通过JSON.Stringify函数从对象转换而来的。
我想知道它是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'));
答案 0 :(得分:29)
“简单”的方法是try
解析并在失败时返回未解析的字符串:
var data = localStorage[key];
try {return JSON.parse(data);}
catch(e) {return data;}
答案 1 :(得分:14)
您可以使用JSON.parse
轻松制作一个。当它收到一个无效的JSON字符串时,它会抛出异常。
function isJSON(data) {
var ret = true;
try {
JSON.parse(data);
}catch(e) {
ret = false;
}
return ret;
}
答案 2 :(得分:5)
在另一篇帖子How do you know if an object is JSON in javascript?
中找到了这个function isJSON(data) {
var isJson = false
try {
// this works with JSON string and JSON object, not sure about others
var json = $.parseJSON(data);
isJson = typeof json === 'object' ;
} catch (ex) {
console.error('data is not JSON');
}
return isJson;
}
答案 3 :(得分:0)
由于问题是“如何检查它是字符串还是json”,也许一种简单的方法就是检查字符串,因此您将在某处执行以下操作:
if (typeof data === 'string') { // check for string!
//... do something
} else {///... do something else}
根据您的整体解决方案,也许这已经足够了,以防万一有人在四处张望。
答案 4 :(得分:0)
我认为同时返回已解析的JSON是一个好主意,因此我更喜欢以下版本:
function tryParse(str) {
try {
return { value: JSON.parse(str), isValid: true }
} catch (e) {
return { value: str, isValid: false }
}
}
您可能知道JSON.parse("1234")
,JSON.parse("0")
,JSON.parse("false")
和JSON.parse("null")
不会引发Exception并返回true。所有这些值都是有效的JSON,但是如果您仅想将isValid
用作true
的对象(例如:{ "key": "value" }
)和数组(例如:[{ "key": "value" }]
),则可以使用以下命令版本:
function tryParse(str) {
try {
var parsed = JSON.parse(str);
return { value: parsed , isValid: typeof parsed === 'object'}
} catch (e) {
return { value: str, isValid: false }
}
}