js如何完整的解析一段字符串?

 var text = "[{"name":"小红","age":12,}]";
 or
 var text = "http://www.baidu.com";
 or
 var text = "12";

有一个字符串可能是上面随机的类型,如何完整的解析。尝试了用JSON.parse和eval都不能很好的解析出来。
求教!!

阅读 3.6k
3 个回答

看起来很简单,似乎加一个 try...catch... 就能够解决

const cases = [
    `[{"name":"小红","age":12,}]`,
    "http://www.baidu.com",
    "12"
];


function parse(s) {
    try {
        return JSON.parse(s);
    } catch (e) {
        console.error("[error]", e);
        return s;
    }
}

cases.map(parse).forEach(it => console.log(it));

但实际上,跑出来才发现 '[{"name":"小红","age":12,}]' 这根本就不是一个 JSON,12 后面有一个逗号。简单地考虑使用 eval 来修,那就在 catch 里再加一层:

function parse(s) {
    try {
        return JSON.parse(s);
    } catch (e) {
        try {
            return globalThis.evel(s);
        } catch (e2) {
            console.error("[error2]", e2);
            // DO nothing
        }

        console.error("[error]", e);
        return s;
    }
}

说实在我是不赞成用 eval 的,但是不用 eval 就得去自己解析。最后还是“懒”占了上风!

不过上面的代码嵌套有点深,而且如果还有别的尝试方法,会更深,所以处理一下:

const parse = (() => {
    const handlers = [
        s => JSON.parse(s),
        s => eval(s),
    ];

    return s => {
        for (const handler of handlers) {
            try { return handler(s); } catch { continue; }
        }
        return s;
    };
})();

简单的说就是一直尝试到成功为此,最后用 return s 来容错。如果你有其他解析方法,按顺序往数组里加就行。
上面的 continue 可以不写,但是避免 eslint(no-empty),所以写个 continue

如果直接是字符串,则直接按script加载即可。这个无论如何都不能用JSON.parse解析的。
不过你第1行字符串肯定是有问题的

var text = "[{"name":"小红","age":12,}]";

无论如何都不是正确的格式,要

var text = [{"name":"小红","age":12,}];

才正确。
如果这个字符串是拼接出来的,需要对[{"name":"小红","age":12,}]进行特殊处理。

如果把var text=去掉,把所有两端的引号去掉,并把内容作为json字符串来处理,则这些内容都应该可以JSON解析。

try catch 语句包一下,不是合法 JSON 数据就还是用原来的数据形式。

function getParsedJson(text) {
  let result;
  try {
    result = JSON.parse(text);
  } catch (e) {
    result = text;
  }
  return result;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题