有没有用于处理 JSON 中的函数和正则表达式的通用 npm或函数?

问题

有没有比较通用的npm或工具函数替换JSON.parse和JSON.stringify处理对象中带有函数,正则

前端原数据

    const forms = [
      {
        name: "aa",
        age: 11,
        call: function (val) {
          console.log("val", val);
        },
      },
    ];

把json转成字符串存储进mysql

[{"name":"aa","age":11,"call":"function (val) {        console.log(\"val\", val);      }"}]

返回给前端的时候,把字符串再转回json,想到得如下数据

    const forms = [
      {
        name: "aa",
        age: 11,
        call: function (val) {
          console.log("val", val);
        },
      },
    ];
阅读 821
avatarAI BotBETA

没有通用的npm或函数可以完全处理JSON中的函数和正则表达式的序列化和反序列化

在JavaScript中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,用于存储和交换文本信息。JSON是纯文本,并且完全是语言无关的。

JSON.stringify方法可以将JavaScript对象转换为JSON字符串,但它不能序列化函数和正则表达式。这是因为JSON是一种数据格式,主要用于存储和交换数据,而不是代码。函数和正则表达式是JavaScript代码的一部分,而不是数据。

同样,JSON.parse方法可以将JSON字符串转换为JavaScript对象,但它也不能解析函数和正则表达式。这是因为JSON格式不包含任何表示代码(如函数或正则表达式)的语法。

如果你需要在数据库中存储包含函数或正则表达式的对象,你可能需要将这些函数或正则表达式转换为字符串或其他可以序列化的形式。然而,需要注意的是,将函数或正则表达式转换为字符串并不意味着你可以在另一个JavaScript环境中重新执行它们。你可能需要找到一种方法来在你的应用程序中重新创建这些函数或正则表达式。

对于前端原数据的处理,你可能需要使用一些自定义的序列化和反序列化方法来处理这些函数和正则表达式。具体的实现方式会取决于你的具体需求和你所使用的技术栈。例如,你可能需要使用一些库或工具来帮助你处理这些复杂的序列化和反序列化问题。

2 个回答
  1. 你这样做很危险呀,很容易被攻击
  2. 不记得见过这样的包,不过感觉深度遍历+函数构建就行了

AI给的答案,对象转字符串stringifyWithFunctionsAndRegex,字符串转对象parseWithFunctionsAndRegex

function customReplacer(key, value) {
  if (value instanceof RegExp) {
    return `__REGEXP:${value.toString()}`;
  } else if (typeof value === 'function') {
    return `__FUNCTION:${value.toString()}`;
  } else {
    return value;
  }
}

function stringifyWithFunctionsAndRegex(obj) {
  return JSON.stringify(obj, customReplacer);
}

const obj = {
  name: 'John',
  age: 30,
  regExp: /test/,
  sayHello: function() {
    console.log('Hello!');
  }
};

const jsonString = stringifyWithFunctionsAndRegex(obj);
console.log(jsonString);
function customReviver(key, value) {
  if (typeof value === 'string' && value.startsWith('__REGEXP:')) {
    const match = value.match(/__REGEXP:(.+)/);
    return new RegExp(match[1]);
  } else if (typeof value === 'string' && value.startsWith('__FUNCTION:')) {
    const match = value.match(/__FUNCTION:(.+)/);
    return eval(`(${match[1]})`);
  } else {
    return value;
  }
}

function parseWithFunctionsAndRegex(jsonString) {
  return JSON.parse(jsonString, customReviver);
}

const jsonString = '{"name":"John","age":30,"regExp":"__REGEXP:/test/","sayHello":"__FUNCTION:function () { console.log(\'Hello!\'); }"}';
const parsedObject = parseWithFunctionsAndRegex(jsonString);
console.log(parsedObject);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题