js中eval()和$.parse()的区别以及JSON.stringify()

1. JSON.parse(jsonString)和eval(jsonString): 在一个字符串中解析出JSON对象

var str = '[{"href":"baidu.com","text":"test","orgId":123,"dataType":"curry","activeClass":"haha"}]'; JSON.parse(str);
结果:

区别一:安全性

JSON.parse()可以解析json格式的数据,并且会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,

而eval()则可以解析任何字符串,eval是不安全的.

区别二:格式严格性
   JSON.parse()解析的必须是json格式的字符串要不报错,而eval()则没有这么严格

   在这里“json格式的字符串”是指要求指定的字符串必须符合严格的JSON格式,例如:属性名称必须加双引号、字符串值也必须用双引号。
   如果传入一个格式不"完好"的JSON字符串将抛出一个JS异常

    json的解析方法共有两种:eval 和 JSON.parse(),如:
   

[javascript]  view plain  copy
  1. var jsonStr= '{"name":"lulu", "sex":"female"}';  
  2. var evalJson=eval('('+jsonStr+')');  
  3. var jsonParseJson=JSON.parse(jsonStr);  
这样就把json格式的字符串jsonStr转换成了JSON对象。

但是区别是:

[javascript]  view plain  copy
  1. var age = 27;  
  2. var jsonStr= '{"name":"lulu", "sex":"female","age":++age}';  
  3. var evalJson=eval('('+jsonStr+')'); //不报错此时age的值是28  
  4. var jsonParseJson=JSON.parse(jsonStr);//报错 

 注意:某些低级的浏览器尚不支持JSON.parse()

   《高性能Javascript》一书即指出:警告:关于JSON和eval需要注意的是:在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身。该方法可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果。如果此方法以备Firfox 3.5 、IE8 及 Safari 4 原生支持。大多数javascript类库包含的JSON解析代码会直接调用原生版本,如果没有原生支持的话,会调用一个略微不那么强大的非原生版本来处理。


2. JSON.stringify(obj) : 将一个JSON对象转换成字符串
var obj = [{"href":"baidu.com","text":"test","orgId":123,"dataType":"curry","activeClass":"haha"}]; JSON.stringify(obj);
结果:
"[{"href":"baidu.com","text":"test","orgId":123,"dataType":"curry","activeClass":"haha"}]"

  • json 字符串和对象的相互转换
JSON.parse( ) 字符串转化为对象

JSON.stringify( ) 对象转还未字符串




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import org.snmp4j.CommunityTarget;import org.snmp4j.PDU;import org.snmp4j.Snmp;import org.snmp4j.TransportMapping;import org.snmp4j.event.ResponseEvent;import org.snmp4j.mp.SnmpConstants;import org.snmp4j.smi.Address;import org.snmp4j.smi.GenericAddress;import org.snmp4j.smi.OID;import org.snmp4j.smi.VariableBinding;import org.snmp4j.transport.DefaultUdpTransportMapping;public class HuaweiRouterSNMP { public static void main(String[] args) { // 设备IP地址 String ipAddress = "192.168.1.1"; // SNMP社区名 String community = "public"; // 设备OID String oidValue = "1.3.6.1.2.1.1.1.0"; try { // 创建SNMP对象 TransportMapping transport = new DefaultUdpTransportMapping(); Snmp snmp = new Snmp(transport); transport.listen(); // 创建目标对象 Address targetAddress = GenericAddress.parse("udp:" + ipAddress + "/161"); CommunityTarget target = new CommunityTarget(); target.setCommunity(GenericAddress.parse(community)); target.setAddress(targetAddress); target.setRetries(2); target.setTimeout(5000); target.setVersion(SnmpConstants.version2c); // 创建PDU对象 PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(oidValue))); pdu.setType(PDU.GET); // 发送请求 ResponseEvent response = snmp.send(pdu, target); if (response.getResponse() != null) { System.out.println("Response: " + response.getResponse().get(0).getVariable().toString()); } else { System.out.println("Error: " + response.getError()); } // 关闭SNMP连接 snmp.close(); } catch (Exception e) { e.printStackTrace(); } }}查看此段代码是否有错
05-30
这段代码看起来基本上是可以工作的,但是需要注意以下几点: 1. `target.setCommunity(GenericAddress.parse(community));` 应该改为 `target.setCommunity(new OctetString(community));`,因为 `setCommunity` 的参数类型是 `OctetString`。 2. `target.setVersion(SnmpConstants.version2c);` 指定的是 SNMP v2c 版本,如果你想要使用 SNMP v1 版本,应该将其改为 `target.setVersion(SnmpConstants.version1);`。 3. SNMP 返回的结果是一个数组,即使你只请求一个 OID,也需要使用 `response.getResponse().get(0)` 获取结果。 4. 为了避免出现 `java.net.BindException: Address already in use: Cannot bind` 错误,你应该在程序结束时关闭 `transport`。 下面是修正后的代码: ```java import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.event.ResponseEvent; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OID; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; public class HuaweiRouterSNMP { public static void main(String[] args) { // 设备IP地址 String ipAddress = "192.168.1.1"; // SNMP社区名 String community = "public"; // 设备OID String oidValue = "1.3.6.1.2.1.1.1.0"; try { // 创建SNMP对象 TransportMapping<? extends Address> transport = new DefaultUdpTransportMapping(); Snmp snmp = new Snmp(transport); transport.listen(); // 创建目标对象 Address targetAddress = GenericAddress.parse("udp:" + ipAddress + "/161"); CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString(community)); target.setAddress(targetAddress); target.setRetries(2); target.setTimeout(5000); target.setVersion(SnmpConstants.version2c); // 创建PDU对象 PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(oidValue))); pdu.setType(PDU.GET); // 发送请求 ResponseEvent response = snmp.send(pdu, target); if (response.getResponse() != null) { System.out.println("Response: " + response.getResponse().get(0)); } else { System.out.println("Error: " + response.getError()); } // 关闭SNMP连接 snmp.close(); transport.close(); } catch (Exception e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值