我试图了解当我从数据库查询数据并将其提供给JSON然后将其推送到GUI时发生了什么,关于转换为字符串的内容和时间。
如果我调用数据库并将此数据作为JSON提供给前端,我的JSON可能看起来像
MyData{ [["Name": "Anna", "Age": 50],["Name": "Bob", "Age": 40 ]};
在视觉上看起来好像Name
的值是一个字符串(因为它在引号中),而Age
的值是一个整数(没有引号)。
我的2个问题是
Name
的值是一个字符串,Age
的值是一个整数,还是在场后转换/转换? DateTime
。根据{{3}}我实际上只是确保格式正确但最终它是一个字符串。答案 0 :(得分:1)
我的理解是
Name
的值是一个字符串,而Age
的值是一个整数......?
几乎。它是数字,可能是也可能不是整数。例如,10.5
是一个数字,但不是整数。
...还是JavaScript在幕后转换/投射?
JavaScript和JSON是不同的东西。 JSON定义该数字将由特定格式的数字.
以及可能的e
或E
字符表示。无论您在哪个环境中解析JSON,都会将该数字映射到其环境中的相应数据类型。在JavaScript的情况下,它是IEEE-754双精度二进制浮点数。因此,从这个意义上讲,如果JSON定义了一个无法在IEEE-754中准确表示的数字,JavaScript可以转换/转换数字,例如9007199254740999
(由于IEEE-754,它变为9007199254741000)只有小数精度的~15位数。)
我如何指定DateTime类型。根据The" right" JSON日期格式我实际上只是确保格式正确但最终它是一个字符串。
JSON具有固定数量的类型:object,array,string,number,boolean,null
。你不能自己添加。因此,您所做的是将您想要的任何类型的元数据编码到键或值中,或者使用具有单独属性的对象来表示类型和值,并在两端强制执行该协议。
执行此操作的一个示例是编码日期/时间值的通用格式:"/Date(1465198261547)/"
。就JSON解析器而言,这只是一个字符串,但许多项目使用它作为指示它实际上是一个日期,其中的数字是自The Epoch以来的毫秒数。 (1970年1月1日午夜,GMT)。
与此相关的两个概念是 replacer 和 reviver :将本机结构转换为JSON时,您正在使用的JSON序列化程序可能支持< em> replacer ,它允许您在序列化期间使用其他值替换值。您正在使用的JSON解析器可能支持 reviver ,它允许您在另一个方向上处理该过程。
例如,如果您正在编写JavaScript代码并希望在JSON层中保留Date
,则可以在序列化为JSON时执行此操作:
var obj = {
foo: "bar",
answer: 42,
date: new Date()
};
var json = JSON.stringify(obj, function(key, value) {
var rawValue = this[key];
if (rawValue instanceof Date) {
// It's a date, convert it to our special format
return "/Date(" + rawValue.getTime() + ")/";
}
return value;
});
console.log(json);
&#13;
使用&#34;替换器&#34; JSON.stringify
的参数,用我之前描述的方式对日期进行编码。
然后你可以在解析那个JSON时这样做:
var json = '{"foo":"bar","answer":42,"date":"/Date(1465199095286)/"}';
var rexIsDate = /^\/Date\((-?\d+)\)\/$/;
var obj = JSON.parse(json, function(key, value) {
var match;
if (typeof value == "string" && (match = rexIsDate.exec(value)) != null) {
// It's a date, create a Date instance using the number
return new Date(+match[1]);
}
return value;
});
console.log(obj);
&#13;
使用&#34; reviver&#34;以特殊格式检测密钥并将其转换回Date
个实例。
答案 1 :(得分:0)