但是在用JSON的过程中,我遇到了一个问题——这个问题想必是大家多少都遇到过,那就是:JSON没有定义日期和时间的传递方式。
尽管在今年3月的一次更新中,json2.js已经增加了对Date函数和ISO-8601式的日期/时间格式,但各种常用的开发工具中对日期的支持还是五花八门、千奇百怪的,完全没有统一。
而且,除了日期/时间以外,个别时候我们还需要一些类或者函数的支持,而这些都是不被JSON所支持的。
可能有的人看到这里要问了:既然JSON不支持,那为什么不去用别的数据描述/传输方式呢?
原因是JSON本身就是JavaScript(其参考标准为ECMAScript)的功能子集,任何稍懂JavaScript的人都可以轻松地利用JSON。
解析JSON最简单的办法是直接使用eval函数将其作为JavaScript代码来执行,而JSON常常被用在互联网上的不同应用之间传递,所以直接将收到的JSON内容传入eval函数是具有很大的风险的,因此在RFC文档中严格规定了JSON的格式,并且给出了检验其安全性的办法。
而这个检验办法就禁止了函数的运行。
总而言之,因为JSON在使用上“偶尔”会有些不方便,所以我就开始动脑筋扩展JSON了。
在参考了RFC-4627、json2.js以及一些常见的JavaScript语法着色器以后,我发现:虽然json2.js已经有了对日期/时间的支持,但它所采用的语法分析的模式,这就意味着如果不是对语法分析有一定的了解,是很难对它进行扩展的;即使我稍微研习过一些语法分析的知识,想要扩展它也并非很容易的事情,更别谈日后的维护了。
所以我决定用RFC-4627中建议的较为简单的正则表达式过滤法。
这个扩展的基本实现是这样的:
function Xenon(){}
var protoXenon = Xenon.prototype;
protoXenon.xeval = function(s){
var al = [], vl = [], ol = {};
function $(i, v){
// i = parseInt(i);
// return ol[i] || (ol[i] = v);
return ol.propertyIsEnumerable(i) ? ol[i] : (ol[i] = v);
}
for(var n in this)
if(this.propertyIsEnumerable(n) && typeof this[n] == 'function')
al.push(n), vl.push(this[n]);
return eval('0,function(' + al + '){return ' + s + ';}').apply(this, vl);
};
protoXenon.safeXeval = function(s){
var T = this;
return (!/[^\),:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
s.replace(/"(\\.|[^"\\])*"/g, '')
.replace(/([^\s:\[,\(]+?)\(/g,function($0, $1){
// return T.propertyIsEnumerable($1) ? '' : $1 + '(';
return T.propertyIsEnumerable($1) ? '' : '@';
})) || null) &&
this.xeval(s);
};
基本用法就是创建一个xenon对象,为其设置新的成员以启用扩展函数。
可以把扩展函数直接添加到xenon对象上,也可以在全局作用域中声明函数再在xenon对象上设置非函数类型的成员值。
例子:
var xenon = new Xenon();
xenon.Array = 0;
xenon.$ = 0;
xenon.date = function(s){return new Date(s);};
var o = xenon.safeXeval('{"list":Array(3,6,9),"created":$(1,date("Tue Jul 27 02:48:03 UTC+0800 2010")),"modified":$(1)}');
print(o.list);
print(o.created);
print(o.modified == o.created);
注:这个例子并不能直接作为JScript.NET代码执行,若要在JScript.NET中使用则必须将字符串"unsafe"作为第二个参数传递给eval函数。
注2:function关键字前增加“0,”是为了兼容于IE所使用的JScript引擎——当前的非CLI版本JScript引擎在其eval的实现中并不能正确地理解包围着函数定义的圆括号的意义,会因此引发语法错误。
在这个例子中使用了三个函数扩展:Array为全局作用域中的JavaScript内置函数;$是我在XENON中实现的内置功能,可以在多处引用同一个对象;而date则是对Date构造器的包装。
在XENON的实现中我没有让它支持new操作符创建新对象,我没发现有要用new而不能直接用扩展函数的理由。
关于名字:起初打算叫做xJson,但是后来想想觉得有点逊,改作XEON(eXtensible ECMAScript Object Notation)之后又发现好像是Intel的注册商标,所以在中间多加了个N变成了XENON(eXtensible Native ECMAScript Object Notation)。查了下字典,是个化学元素的名字……就这么凑合用吧。
关于安全性:在设计检验方法的过程中我尽可能测试了我所想得到的字符组合,力求避免注入问题。但是由于缺乏实践检验,我也不擅长语法分析之类的事情,所以可能并不是绝对安全。如果谁发现了其中的安全漏洞,可以通知我来改进它。
以后有时间我会做一个简单的从ECMAScript对象向XENON转换的函数;如果真的有很充裕的时间,也许我还会实现包含类名和构造器的转换过程。

1、先看看效果图,可以自行选择展示效果2、这是我在vue3项目中使用的JSON编辑器,首先引入第三方插件npminstalljson-editor-vue3yarnaddjson-editor-vue33、引入到项目中//导入模块importJsonEditorVuefrom'json-editor-vue3'//注册组件components:{JsonEditorVue},4、一般后端返回的是会将JSON转为String形式我们传给后端也是通过这种形式,就可以通

控制json序列化/反序列化1.@JsonIgnoreProperties的用法@JsonIgnoreProperties(value={"prop1","prop2"})用来修饰Pojo类,在序列化和反序列化的时候忽略指定的属性,可以忽略一个或多个属性.@JsonIgnoreProperties(ignoreUnknown=true)用来修饰Pojo类,在反序列化的时候忽略那些无法被设置的属性,包括无法在构造子设置和没有对应的setter方法.2.@Js

Java调用接口获取json数据保存到数据库1.在yml文件中配置自己定义的接口URL//自己定义的JSON接口URLblacklist_data_url:接口URL2.在Controller中添加请求方法和路径/***@Title:查询*@Description:查询车辆的记录*@Author:半度纳*@Date:2022/9/2717:33*/@GetMapping("/Blacklist")publicvoidselectBlacklist(){booleana=imB

PHP作为一种常见的编程语言,在web开发中使用广泛,其与前端交互的方式也多种多样。其中,输出Json数据是一种常见的交互方式,但有时候会碰到Json无法解析的问题。为什么会出现无法解析的情况呢?下面列举了几个可能的原因。

当我们处理数据时经常会遇到将XML格式转换为JSON格式的需求。PHP有许多内置函数可以帮助我们执行这个操作。在本文中,我们将讨论将XML格式转换为JSON格式的不同方法。

本篇文章给大家带来了关于JWT的相关知识,其中主要介绍了什么是JWT?JWT的原理以及用法是什么?感兴趣的朋友,下面一起来看一下吧,希望对大家有帮助。

JSONSchemaJSONSchema是用于验证JSON数据结构的强大工具,Schema可以理解为模式或者规则。JsonSchema定义了一套词汇和规则,这套词汇和规则用来定义Json元数据,且元数据也是通过Json数据形式表达的。Json元数据定义了Json数据需要满足的规范,规范包括成员、结构、类型、约束等。JSONSchema就是json的格式描述、定义、模板,有了他就可以生成任何符合要求的json数据json-schema-validator在java中,对json数据格式的校验,使用

一、@RestController注解在SpringBoot中的Controller中使用@RestController注解即可返回JSON格式的数据。@RestController注解包含了@Controller和@ResponseBody注解。@ResponseBody注解是将返回的数据结构转换为JSON格式。@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Controller@Respons


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)