Json值是否特定于类型

时间:2016-06-06 07:24:45

标签: json

我试图了解当我从数据库查询数据并将其提供给JSON然后将其推送到GUI时发生了什么,关于转换为字符串的内容和时间。

如果我调用数据库并将此数据作为JSON提供给前端,我的JSON可能看起来像

MyData{ [["Name": "Anna", "Age": 50],["Name": "Bob", "Age": 40 ]};

在视觉上看起来好像Name的值是一个字符串(因为它在引号中),而Age的值是一个整数(没有引号)。

我的2个问题是

  1. 我的理解是Name的值是一个字符串,Age的值是一个整数,还是在场后转换/转换?
  2. 如何指定类型 DateTime。根据{{​​3}}我实际上只是确保格式正确但最终它是一个字符串。

2 个答案:

答案 0 :(得分:1)

  

我的理解是Name的值是一个字符串,而Age的值是一个整数......?

几乎。它是数字,可能是也可能不是整数。例如,10.5是一个数字,但不是整数。

  

...还是JavaScript在幕后转换/投射?

JavaScript和JSON是不同的东西。 JSON定义该数字将由特定格式的数字.以及可能的eE字符表示。无论您在哪个环境中解析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时执行此操作:

&#13;
&#13;
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;
&#13;
&#13;

使用&#34;替换器&#34; JSON.stringify的参数,用我之前描述的方式对日期进行编码。

然后你可以在解析那个JSON时这样做:

&#13;
&#13;
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;
&#13;
&#13;

使用&#34; reviver&#34;以特殊格式检测密钥并将其转换回Date个实例。

答案 1 :(得分:0)

JSON Schema的特定格式可由JSON Schema描述,如here所述;特别是,date-time显然是已经在JSON Schema中定义的类型。