首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不使用eval()从循环字符串创建JSON对象树

从循环字符串创建JSON对象树的方法有很多,eval()只是其中一种方法,但由于eval()存在安全风险和性能问题,不推荐使用。以下是一种不使用eval()的方法:

  1. 首先,将循环字符串解析为一个数组,每个元素表示一个JSON对象。
  2. 创建一个空的根节点对象。
  3. 遍历数组中的每个元素,依次处理每个JSON对象。
  4. 对于每个JSON对象,解析其属性和值。
  5. 根据属性和值创建对应的JSON对象,并将其添加到根节点对象中。
  6. 如果属性值是一个嵌套的JSON对象,递归地执行步骤3-5,直到所有嵌套的JSON对象都被处理完毕。
  7. 返回根节点对象作为最终的JSON对象树。

这种方法可以避免使用eval(),提高代码的安全性和性能。

以下是一个示例代码,演示如何使用这种方法从循环字符串创建JSON对象树:

代码语言:txt
复制
function createJSONObject(str) {
  const objects = str.split(';'); // 将循环字符串解析为数组
  const root = {}; // 创建根节点对象

  objects.forEach(obj => {
    const [property, value] = obj.split(':'); // 解析属性和值
    const properties = property.split('.'); // 解析属性路径

    let currentNode = root;
    properties.forEach((prop, index) => {
      if (!currentNode[prop]) {
        currentNode[prop] = {}; // 创建属性对应的对象
      }

      if (index === properties.length - 1) {
        currentNode[prop] = JSON.parse(value); // 设置属性值
      }

      currentNode = currentNode[prop]; // 更新当前节点
    });
  });

  return root;
}

const jsonString = 'person.name: "John"; person.age: 30; person.address.city: "New York"; person.address.zip: 12345';
const jsonObject = createJSONObject(jsonString);
console.log(jsonObject);

这个示例代码将循环字符串person.name: "John"; person.age: 30; person.address.city: "New York"; person.address.zip: 12345解析为以下JSON对象树:

代码语言:txt
复制
{
  "person": {
    "name": "John",
    "age": 30,
    "address": {
      "city": "New York",
      "zip": 12345
    }
  }
}

这种方法可以灵活地处理循环字符串,创建相应的JSON对象树,而不依赖于eval()函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

前端二面必会面试题(附答案)

(3)针对DOM、CSSOM: 可以通过以下几种方式来减少渲染的时间:HTML文件的代码层级尽量不要太深使用语义化的标签,来避免标准语义化的特殊处理减少CSSD代码的层级,因为选择器是左向右进行解析的...实现 Object.createObject.create()方法创建一个新对象使用现有的对象来提供新创建对象的proto。...';var obj = eval("(" + json + ")"); // obj 就是 json 反序列化之后得到的对象但是直接调用 eval 会存在安全问题,如果数据中可能不是 json 数据,....replace(rx_four, "") )) { var obj = eval("(" +json + ")");}new Function 实现Function 与 eval 有相同的字符串参数特性...eval执行上下文:建议使用,可忽略。

1.1K40

大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章

ECMAScript 5 有一个 API,用于将 JSON 格式的字符串转换为 JavaScript 值(解析)以及反之(字符串化)。 背景 本节解释了 JSON 是什么以及它是如何创建的。...使用 JavaScript 表达式中的以下结构: 复合 JSON 数据的对象JSON 数据的数组 原子 字符串、数字、布尔值和空值 它遵循以下规则: 字符串必须始终用双引号括起来;例如,像'mystr...|--|--"\n" |--] } 因此,以下对JSON.stringify()的调用会将对象打印为一个格式良好的JSON.stringify(data, null, 4) JSON.stringify...]) '[null]' toJSON()方法 如果JSON.stringify()遇到具有toJSON方法的对象,则使用该方法获取要字符串化的值。...JavaScript 数据是一个,其复合节点是数组和对象,其叶子是原始值(布尔值,数字,字符串,null)。让我们将传递的转换函数称为节点访问者。这些方法遍历并为每个节点调用访问者。

16710
  • 50道JavaScript基础面试题(附答案)

    两种类型的区别是:存储位置不同;原始数据类型直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;引用数据类型存储在堆中的对象,占据空间大、大小固定,如果存储在栈中,...11 eval是做什么的? 它的功能是把对应的字符串解析成JS代码并运行;应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。 12 什么是window对象?...两个函数: JSON.parse(str) 解析JSON字符串JSON字符串变成JavaScript值或对象 JSON.stringify(obj) 将一个JavaScript值(对象或者数组)转换为一个...JSON字符串 eval('('+json+')') 用eval方法注意加括号 而且这种方式更容易被攻击 23 JS延迟加载的方式有哪些?...两个对象创建,并互相引用,形成了一个循环。它们被调用之后不会离开函数作用域,所以它们已经没有用了,可以被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。

    13.8K01

    python笔记75-compile() 函数将字符串转字节代码

    字符串或者AST抽像语法(Abstract Syntax Trees)对象。...参数filename用于在执行代码报错的运行时错误消息中显示该参数对应的信息,当source是执行代码文件中读取的代码字符串时,则可以存放文件名,如果不是文件里读取源码来编译,那么这里可以放一些用来标识这些代码的字符串...或eval来执行,而AST可以使用eval()来继续编译(关于AST的内容本节都不介绍,ATS 对象:Abstract Syntax Tree,抽象语法,是源代码语法结构的一种抽象表示。...AST 对象时,Python 解释器会因为 Python AST 编译器的栈深度限制而崩溃 使用示例 先执行一个简单的代码段, 代码段写到一个字符串 a = """ x = "hello" print...() 函数的使用 eval 也可以把字符串当代码去执行 # 表达式 c = "3+5" print(eval(c)) # 8 eval 只能执行一个表达式,不能执行代码段 # 代码段无法执行 c = "

    1.3K30

    如何使JavaScript更高效

    隔离 eval 和 with 的使用 尽量不用全局变量 注意对象的隐式换 在要求性能的函数中避免使用 for-in 使用累加形式连接字符串 基本运算比调用函数更快 为 setTimeout() 和 setInterval...比如,var oString = 'some content'; 创建了一个字符串值,而 var oString = new String('some content'); 创建了等价的字符串对象。...所有属性和方法都是在字符串对象而不是值上定义的。如果你对字符串值调用属性和方法,ECMAScript 引擎必须用相同的字符串值隐式地创建一个新的字符串对象,然后才能调用方法。...这个对象仅用于这一个需求,如果下次再对字符串值调用某个方法,会再次类似地创建字符串对象。 下面的示例的让脚本引擎创建 21 个新的字符串对象。...一是使用脚本进行了大量的 DOM 操作,比如通过收到的数据创建一棵。二是脚本触发了太多重排或者重绘。三是脚本使用了低性能的方法来定位 DOM 中的节点。

    1.6K10

    JS性能优化

    4.尽量少使用eval,每次使用eval需要消耗大量时间,这时候使用JS所支持的闭包可以实现函数模板。...而.toString()要查询原型中的函数,所以速度逊色一些,new String()需要重新创建一个字符串对象,速度最慢。 8....而且Math是内部对象,所以Math.floor()其实并没有多少查询方法和调用时间,速度是最快的。 9.尽量作用JSON格式来创建对象,而不是var obj=new Object()方法。...因为使用JSON格式的语法是引擎直接解释的。而后者则需要调用Array的构造器。 11.[顶]对字符串进行循环操作,例如替换、查找,就使用正则表达式。...因为JS的循环速度比较慢,而正则表达式的操作是用C写成的API,性能比较好。 最后有一个基本原则,对于大的JS对象,因为创建时时间和空间的开销都比较大,因此应该尽量考虑采用缓存。

    2.4K80

    前端常见面试题总结_2023-02-23

    (Event Loop) 事件循环机制整体上告诉了我们 JavaScript 代码的执行顺序 Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制...当后端接收到 JSON 格式的字符串时,可以通过这个方法来将其解析为一个 js 数据结构,以此来进行数据的访问。...实现 Object.create Object.create()方法创建一个新对象使用现有的对象来提供新创建对象的proto。...对包含循环引用的对象对象之间相互引用,形成无限循环)执行此方法,会抛出错误。..."b":2}'; var obj = eval("(" + json + ")"); // obj 就是 json 反序列化之后得到的对象 但是直接调用 eval 会存在安全问题,如果数据中可能不是

    76410

    JSON教程

    使用 JSON · 读取 JSON 字符串 · 用 eval() 处理 JSON 字符串 五、JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集...对象可以包含多个 key/value(键/值)对。 key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。...“, “alexa“:10000, “site“:null}; x = myObj[“name“]; 3.循环对象 你可以使用 for-in 来循环对象的属性: 实例 varmyObj = {...通过 JavaScript,您可以创建一个对象数组,并像这样进行赋值: 实例 varsites = [ { “name“:“google“ , “url“:“www.google.com“},...{ “name“:“微博“ , “url“:“www.weibo.com“} ]; 可以像这样访问JavaScript 对象数组中的第一项(索引 0 开始): sites[0].name; 返回的内容是

    2K30

    40道+JavaScript基础面试题(附答案)

    11、 eval是做什么的? 它的功能是把对应的字符串解析成JS代码并运行;应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。 12、 什么是window对象?...两个函数: JSON.parse(str) 解析JSON字符串JSON字符串变成JavaScript值或对象 JSON.stringify(obj) 将一个JavaScript值(对象或者数组)转换为一个...JSON字符串 eval('('+json+')') 用eval方法注意加括号 而且这种方式更容易被攻击 22、 JS延迟加载的方式有哪些?...定期的,垃圾回收器将从根开始,找所有根开始引用的对象,然后找这些对象引用的对象根开始,垃圾回收器将找到所有可以获得的对象和所有不能获得的对象。 2) 引用计数: 这是最简单的垃圾收集算法。...两个对象创建,并互相引用,形成了一个循环。它们被调用之后不会离开函数作用域,所以它们已经没有用了,可以被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。

    1.1K10

    手写一个解析器

    字符串里面有运算符,例如 =C1+C2+"=C1+C2"。 运算有左右括号匹配来改变运算优先级,例如 =(C1+C2)*C3 这个时候光使用正则表达式就比较棘手了。...例如 if (...) { a = "123" } 这个 "if" 符号包含了字符串符号 "123"。 终结符:当一个符号包含其他符号了,那么它就是终结符。...解析 Parser 结果 步骤 2 完成了之后,我们就可以得到 DSL 代码对应的抽象语法,所谓的抽象语法其实就是一个 JSON 对象,例如 =C1+D1*E1 这个代码对应的 JSON 对象的结构就如下图所示...那么下一步就是怎么解析这个树状结构的对象,然后得到它对应的结果。...这里我们用最简单的自循环解析器来对这棵进行求值。自循环解析器的原理很简单,我们将得到的 AST 进行底往上地求值,整个过程是对进行深度遍历完成的。

    1.2K41

    2020年前端面试题及答案_结构化面试题库及答案

    创建一个空对象,并且this变量引用该对象,同时还继承了该函数的原型; 属性和方法被加入到this引用的对象中; 新创建对象由this所引用,并且最后隐式地返回this。...forEach循环——不能遍历对象,不可以使用continue、break跳出循环,且使用return是跳出本次循环。 10、map与forEach的区别?...26、eval是做什么的? eval可以把字符串解析成JS代码并运行; 避免使用eval,不安全,非常消耗性能; 把JSON字符串传换成JSON对象时可以使用eval。...JSON是一种轻量级的数据交换格式; 基于javascript的一个子库,数据格式简单,易于读写,占用带宽小; JSON字符串可以转换成JSON对象JSON对象可以转换成JSON字符串。...57、变量对象? 变量对象,是执行上下文的一部分,可以抽象为一种数据作用域,其实也可以理解为就是一个简单的对象,它存储着该执行上下文中的所有变量和函数声明(包含函数表达式)。

    2.5K20

    eval解析json字符串

    场景:在springMVC,手动拼接的list,转成本json字符串后,传到前台, 解决:需要解析成json对象,获取对象的属性,动态生成table。...//什么需要转成json字符串,就将对应的list放进去进行转换 3 map.put("balanceList", json); 4 return map; 然后,前台通过Ajax进行接收: /* 根据查询条件动态创建...obj[j]; var table= $("").addClass("table"+j).appendTo($("#table_div"));//list中有多少条记录,循环创建多少个...对象 用net.sf.json包下JSONArray的静态方法:fromObject(list) 这是网上大多是都是直接用此方法快捷转换JSON,但是对于Hibernate级联操作关联的对象...在JS中将JSON字符串解析成JSON数据格式 var dataObj=eval("("+data+")");//转换为json对象  (3)Jquery 操作dom    第一次写,表示挺好用的

    1.1K20

    JSON学习笔记

    进行传输 与 XML 不同之处 没有结束标签 更短 读写的速度更快 能够使用内建的 JavaScript eval() 方法进行解析 使用数组 不使用保留字 为什么使用 JSON?...对于 AJAX 应用程序来说,JSON 比 XML 更快更易使用使用 XML 读取 XML 文档 使用 XML DOM 来循环遍历文档 读取值并存储在变量中 使用 JSON 读取 JSON 字符串...用 eval() 处理 JSON 字符串 JSON 实例 简单实例 这个 sites 对象是包含 3 个站点记录(对象)的数组。...创建 JSON 对象 网站名称: 网站地址: 网站标语:...值 JSON 值可以是: 数字(整数或浮点数) 字符串(在双引号中) 逻辑值(true 或 false) 数组(在方括号中) 对象(在花括号中) null JSON 对象 JSON 对象在花括号中书写

    1.3K40

    手把手教你写一个迷你 Webpack

    代码转换,获取模块信息 我们使用 fs 读取文件内容,使用 parser 将模块代码转换成抽象语法,再使用 traverse 遍历抽象语法,针对其中的 ImportDeclaration 节点保存模块的依赖信息...,最终使用 babel.transformFromAst 方法将抽象语法还原成 ES5 风格的代码。...分析依赖关系 入口文件开始,循环解析每个文件与其依赖文件的信息,最终生成以文件名为 key,以包含依赖关系与编译后模块代码的对象为 value 的依赖图谱对象并返回。...生成打包代码 生成依赖图谱对象,作为参数传入一个自执行函数当中。可以看到,自执行函数中有个 require 函数,它的作用是通过调用 eval 执行模块代码来获取模块内部 export 出来的值。...,防止在模板字符串中调用toString()返回[object Object]     const graphStr = JSON.stringify(graph);     const code =

    54210
    领券