如果JSON.parse能够转换成功,并且不等于 null,
并且转换后的类型为object,或 array,那么这个字符串就是JSON格式的字符串
JSON.parse()之后,还必须判断数据类型,因为还有很多列外,例如

  1. JSON.parse('123'); // 123
  2. JSON.parse('{}'); // {}
  3. JSON.parse('true'); // true
  4. JSON.parse('"foo"'); // "foo"
  5. JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
  6. JSON.parse('null'); // null

isJSON

判断数据是不是 对象或数组格式

  1. function isJSON(value) {
  2. if (typeof value == 'string') {
  3. try {
  4. const obj = JSON.parse(value);
  5. const isObject = (typeof obj === 'object') || Array.isArray(obj);
  6. return !!(obj && isObject);
  7. } catch (e) {
  8. return false;
  9. }
  10. }
  11. else if(value && typeof value === 'object') {
  12. return true
  13. }
  14. }

判断字符串是不是 json

字符串转化的值,如果是对象,或数组,就认为是 Object

  1. function isJSON(value) {
  2. if (typeof value == 'string') {
  3. try {
  4. const obj = JSON.parse(value);
  5. return !!(obj && isObject);
  6. } catch (e) {
  7. return false;
  8. }
  9. }
  10. }
  11. function isObject (obj) {
  12. const isObject = Object.prototype.toString.call(obj) === '[object Object]';
  13. return isObject || Array.isArray(obj);
  14. }

验证的值有

  • ‘123’
  • 123
  • ‘true’
  • ‘undefined’
  • ‘null’
  • ‘[]’
  • ‘{}’
  • 不规范的 json格式也返回 false
    • JSON.parse(‘{“name”:”123”,}’) 报错,
    • isJSON(‘[10,]’)

isJSON缺点

  • 如果传入的值是 new String(), 或 new Date,以 new开头的会返回 true
  • 因为 (new Date) instanceof Object,返回 true
  • 所以不要传入构造函数,直接传入字符串