12

我想知道如何在 json 文件中设置今天的日期,就像我们在 js 中使用的那样。

是否有任何选项可以在 json 文件中指定 Date.today() ?

因为,每当我们读取 json 文件时,json 数据都有指定系统日期的日期对象。

希望,你会明白我想说什么。

提前致谢,

-拉贾。

4

8 回答 8

12

服务器端可以生成 ISO 格式的 JSON 日期,例如 "2012-04-30T02:15:12.356Z" 然后客户端可以解析并加载到日期对象中

new Date(Date.parse("2012-04-30T02:15:12.356Z"))
于 2012-04-30T02:19:23.543 回答
10

JSON 是一种结构化的传输格式。它没有逻辑。

但这里有一些选择:

  1. 为什么不直接获取读取文件的日期呢?

  2. 让服务器生成包含生成日期的 JSON。但是,如果您想要当前日期,这并不理想。当您读取文件时,服务器生成的日期已经过去。

  3. 构建一个解析字符串并使其搜索自定义标记的解析器。

例如,特殊标记包含在@{}. 获取里面的命令,确定命令,执行替换。

var jsonString = '{"data1" : "foo","date" : "@{currentdate}"}'

在这种情况下,我会找到@{currentdate}. 我应该创建一个与此命令对应的函数,以@{currentdate}在读取期间替换为当前日期(以您想要的格式)

var parsedString = jsonString.replace(/@\{(\w+)\}/g, function(match, group) {    
    if (group === 'currentdate') {
        return new Date();
    } 
    else if (group === 'anotherCommand') {
        return 'anotherValue';
    } //and so on
});

结果是这样的:

jsonString = '{"data1" : "foo","date" : "Fri May 04 2012 01:17:07 GMT-0700 (PDT)"}'
于 2012-04-25T07:22:18.460 回答
5

我建议您考虑使用JSON-js ( json2.js ) 解析器,因为它解析所有标准 JSON,还允许您添加自定义解析处理逻辑,称为reviver函数,它非常适合您的场景。使用自定义处理程序调用 JSON 解析器的基本语法如下所示:

var myObject = JSON.parse(myJSONtext, reviverFunction);

使用您的示例输入作为指导,它可以设置为像这样工作:

var jsonTxt = '[{' +
        '"data1": "foo",' +
        '"Date":  "",' +
        '"childs": [{' +
            '"data2": "stack",' +
            '"Date": ""' +
        '}{}{}...]}]';    //and-on-and-on as in your comment

myData = JSON.parse(jsonTxt, function ( key, value ) {
    if ( key === 'Date') { return new Date(); }
    //any additonal custom logic you may need later...
});

JSON in JavaScript 页面提供了 JSON-js 的一般介绍,以及一些关于 JSON 的简要介绍信息,该页面还包含一些使用场景。

于 2012-05-01T05:48:57.443 回答
2

你可以考虑利用像moment.js这样的流行库http://momentjs.com/

然后您可以将日期存储为 json 中的 YYYY-MM-DD 并让 moment 处理解析:

var dateString = '2012-11-01';
var someday = moment(dateString);
var formattedDate = someday.format('ddd, DD MMM YYYY'); // 'Thu, 01 Nov 2012'
于 2012-05-01T04:43:33.960 回答
1

每次读取文件时计算当前系统数据不是更容易吗?我可能在这里缺少上下文,但我没有看到将其存储在文档中的意义。

如果你真的需要这样做,你可以这样做

var jsonObject = {"now":"new Date()"};
var date = eval(jsonObject.now);
于 2012-04-25T07:28:28.397 回答
1

如果您想存储日期,我更愿意将其存储为格式为 yyyy/mm/dd hh:mm:ss 或类似格式的字符串,并在我想在 Date 对象中读取它时将其解析为我需要的语言。

obj = {
    dates : ['2012/04/30 10:14:23', '2012/05/01 05:34:01']
}

我不明白您到底想要什么,使用 eval 方法(这是一种丑陋的做法),您可以添加一个方法来将实际日期放入对象中,并且还可以将自己添加到子项中并调用子项中添加的方法。

obj = {
    data : "foo",
    addDate : function() {
        this.date = newDate();
        if (this.children) {
            for (var i = 0; i < this.children.length; i++) {
                this.children[i].addDate = this.addDate;
                this.children[i].addDate();
            }
        }
    },
    children : [{
        data : "foo2"
    }]
}

PS如果要将其存储在文件中,则必须使用 eval 方法(不推荐)将方法存储为字符串或每次加载文件时

jsonLoaded; // this var has the json that you store in a file;
var addDate = function() {
    this.date = newDate();
    if (this.children) {
        for (var i = 0; i < this.children.length; i++) {
            this.children[i].addDate = this.addDate;
            this.children[i].addDate();
        }
    }
    this.addDate = null; // remove the function we have added
    // delete this.addDate; // if is compatible with browser
}
jsonLoaded.addDate = addDate;
jsonLoaded.addDate();

您不能使用函数对 json 对象进行字符串化,因此,在添加方法 addDate 后的第二个方法中,我们将其从 json 对象中删除(您也可以删除 this.addDate,但我不知道它是否适用于 IE )

于 2012-04-29T08:07:33.570 回答
0

收集您想要转移到的所有日期会很好

Collection<String> dates = new ArrayList<String>();

将此集合转换为 json 对象,然后在接收端将其转换回日期。您可以使用 joda 日期时间 API 进行转换。

于 2012-05-02T13:50:54.083 回答
0

我在 java 中使用 Gson 创建 json 输出,但是 Gson 不允许我将 javascript 函数放入 json 中。所以这就是我要做的:在你想要放置代码的地方使用替换标签(比如早期的答案之一)。然后获取json的文本,替换标签,然后将文本保存到你的json文件中:

    Map<String, String> dynamicDates = new HashMap<>();
    dynamicDates.put("d1", "new Date()");
    dynamicDates.put("d2", "new Date(2015, 0, 1, 9, 30)");
    dynamicDates.put("d3", "new Date(2015, 0, 1, 12, 30)");

    JsonObject json = new JsonObject();
    JsonObject root = new JsonObject();
    JsonObject level_1_A = new JsonObject();
    JsonObject level_1_B = new JsonObject();
    json.add("root", root);
    root.add("level_1_A", level_1_A);
    root.add("level_1_B", level_1_B);

    level_1_A.addProperty("d1", "${d1}");
    level_1_A.addProperty("d2", "${d2}");
    level_1_B.addProperty("d3", "${d3}");

    StringBuilder sb = new StringBuilder();
    new GsonBuilder().setPrettyPrinting().create().toJson(json, sb);

    String str = sb.toString();
    for (String key : dynamicDates.keySet()) {
        str = str.replace("\"${" + key + "}\"", dynamicDates.get(key));
    }
    String jsonText = str;
    String javascriptText = "var myJson = " + str + ";";

    System.out.println(jsonText);
    System.out.println(javascriptText);

所以在使用这个 json 时,消费端没有什么可做的。第一个输出是:

    {
      "root": {
        "level_1_A": {
          "d1": new Date(),
          "d2": new Date(2015, 0, 1, 9, 30)
        },
        "level_1_B": {
          "d3": new Date(2015, 0, 1, 12, 30)
        }
      }
    }

我对 json 的使用通常是将其保存为带有分配的 javascript,所以这对我有用。

于 2015-08-14T16:14:46.697 回答