2012-04-25 24 views
7

Tôi tự hỏi làm thế nào để đặt ngày hôm nay trong tệp json như chúng ta đang sử dụng trong js.ngày xác định trong tệp json

Có tùy chọn nào để chỉ định Date.today() trong tệp json không?

Vì dữ liệu json có đối tượng ngày chỉ định ngày hệ thống bất cứ khi nào chúng tôi đọc tệp json.

Hy vọng, bạn sẽ hiểu những gì tôi đang cố gắng nói.

Xin cảm ơn trước,

-Raja.

+0

Tệp json đến từ đâu và bạn định làm gì với nội dung của nó? Liệu nó chỉ chứa các giá trị bạn sẽ sử dụng trong mã javascript của bạn, hoặc bạn sẽ tạo ra đầu ra (chẳng hạn như HTML) từ dữ liệu không? – Julian

+0

Tôi cần lấy ngày và phải thực hiện một số tính toán ở bên html –

+0

tôi không thực sự gặp vấn đề của bạn. Tôi đã đọc các bình luận bạn đã thực hiện, nhưng bạn có thể vui lòng nêu rõ hơn một chút về vấn đề của bạn không? Có lẽ một ví dụ, tại sao bạn cần điều đó. - thanks – Neysor

Trả lời

8

JSON là định dạng truyền tải có cấu trúc. Nó không có logic trong nó.

Nhưng đây là lựa chọn:

  1. Tại sao không chỉ nhận được ngày khi bạn đọc các tập tin để thay thế?

  2. Có máy chủ tạo JSON đó bao gồm ngày tạo ra nó. Tuy nhiên, điều này không lý tưởng nếu bạn muốn ngày hiện tại. Khi bạn đọc tệp, ngày tạo bởi máy chủ đã qua rồi.

  3. tạo trình phân tích cú pháp phân tích chuỗi và làm cho nó tìm kiếm đánh dấu tùy chỉnh.

For example, đánh dấu đặc biệt được chứa trong @{}. Nhận lệnh bên trong, xác định lệnh và thực hiện thay thế.

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

Trong trường hợp này, tôi sẽ tìm thấy @{currentdate}. Tôi nên tạo một hàm tương ứng với lệnh này để thay thế @{currentdate} vào ngày hiện tại trong quá trình đọc (trong định dạng mà bạn muốn)

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

và kết quả là như thế này:

jsonString = '{"data1" : "foo","date" : "Fri May 04 2012 01:17:07 GMT-0700 (PDT)"}' 
+0

Không chỉ một ngày. tôi có rất nhiều đối tượng ngày tháng trong dữ liệu json. Lấy ngày trong khi đọc không phải là tốt nhất. Tôi cần phải được thực hiện nó trong chính json. Còn cách nào khác không? –

+1

@RajaGopal có một máy chủ tạo tệp json, để nó có thể nối thêm ngày tạo hiện tại. AFAIK, JSON không chứa logic. nó chỉ là một định dạng truyền tải. – Joseph

+0

Bạn có thể giải thích cách thực hiện điểm thứ 3 không? –

1

Sẽ không phải nó được dễ dàng hơn chỉ để tính toán dữ liệu hệ thống hiện tại bất cứ khi nào bạn đọc tệp? Tôi có thể thiếu ngữ cảnh ở đây nhưng tôi không thấy điểm lưu trữ trong tài liệu.

Nếu bạn thực sự cần phải làm như vậy bạn có thể làm như sau

var jsonObject = {"now":"new Date()"}; 
var date = eval(jsonObject.now); 
+0

Điều này không hoạt động khi dữ liệu json có Cấu trúc phân cấp. Tôi cần phải được thực hiện nó trên json chính nó. Còn cách nào khác không? –

+0

@RajaGopal Bạn nên làm rõ ý nghĩa của "Vấn đề phân cấp". Có phải trường hợp nhiều mục "ngày" có thể xảy ra ở các độ sâu khác nhau trong đối tượng json của bạn không? – Julian

+0

Dữ liệu json của tôi phải như thế này, [{"data1": "foo", "Date": "", "childs": [{"data2": "stack", "Date": ""} {} { } ..]}] và như vậy trên –

1

Nếu bạn muốn lưu trữ ngày, tôi muốn để lưu trữ như là một String với một định dạng như yyyy/mm/hh dd: mm: ss hoặc một cái gì đó như thế, và phân tích nó trong một đối tượng Date khi tôi muốn đọc nó bằng ngôn ngữ tôi cần.

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

Tôi không hiểu chính xác những gì bạn muốn, với các phương pháp eval (nó là một thực tế xấu xí), bạn có thể thêm một phương pháp để đặt ngày thực tế trong đối tượng, và cũng cho biết thêm mình vào trẻ em và gọi phương pháp được thêm vào trẻ em.

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 nếu bạn muốn lưu trữ nó trong một tập tin, sau đó bạn phải sử dụng phương pháp eval (không khuyến khích) lưu trữ các phương pháp như là một chuỗi hoặc thời gian Évry bạn tải các tập tin làm

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(); 

bạn không thể xâu chuỗi các đối tượng json với các hàm, vì điều này, trong phương thức thứ hai sau khi thêm phương thức addDate, chúng ta loại bỏ nó khỏi đối tượng json (bạn cũng có thể xóa this.addDate, nhưng tôi không biết nó có hoạt động không IE)

10

Phía máy chủ có thể tạo ngày JSON theo định dạng ISO chẳng hạn " 2012-04-30T02: 15: 12.356Z" Sau đó, phía khách hàng có thể phân tích và nạp vào đối tượng ngày

new Date(Date.parse("2012-04-30T02:15:12.356Z")) 
1

Bạn có thể xem xét tận dụng thư viện phổ biến như moment.js http://momentjs.com/

Sau đó, bạn có thể lưu trữ ngày như YYYY-MM-DD trong json và để cho khoảnh khắc xử lý các phân tích cú pháp:

var dateString = '2012-11-01'; 
var someday = moment(dateString); 
var formattedDate = someday.format('ddd, DD MMM YYYY'); // 'Thu, 01 Nov 2012' 
4

tôi đề nghị bạn nên xem xét sử dụng JSON-js (json2.js) phân tích cú pháp, bởi vì nó phân tích tất cả các tiêu chuẩn JSON, mà còn cho phép bạn thêm mệnh tùy chỉnh se xử lý logic, được gọi là hàm reviver, phù hợp với kịch bản của bạn rất tốt. Cú pháp cơ bản để gọi phân tích cú pháp JSON với một handler tùy chỉnh như sau:

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

Sử dụng ví dụ đầu vào của bạn như một hướng dẫn, nó có thể được thiết lập để làm việc như thế này:

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... 
}); 

Giới thiệu chung về JSON-js được cung cấp tại số JSON in JavaScript page, cùng với một số thông tin giới thiệu ngắn gọn về JSON và trang cũng bao gồm một số tình huống sử dụng.

0

nó sẽ được tốt để thu thập tất cả các ngày mà bạn muốn chuyển thành một Chuyển đổi

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

bộ sưu tập này cho một đối tượng JSON và sau đó vào cuối cập nhật dữ, chuyển đổi nó trở lại cho đến nay. Bạn có thể sử dụng API thời gian ngày joda để chuyển đổi.

0

Tôi sử dụng Gson trong java để tạo đầu ra json, nhưng Gson không cho phép tôi đặt các hàm javascript vào json. Vì vậy, đây là những gì tôi làm: Sử dụng thẻ thay thế cho những nơi bạn muốn đặt mã (như một trong các câu trả lời trước đó). Sau đó lấy văn bản của json, thay thế các thẻ và sau đó lưu văn bản vào tệp json của bạn:

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); 

Vì vậy, không còn gì để thực hiện khi sử dụng json này. Và đầu ra đầu tiên là:

{ 
     "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) 
     } 
     } 
    } 

Việc sử dụng json của tôi thường lưu nó dưới dạng javascript với bài tập, vì vậy điều này đã làm việc cho tôi.

Các vấn đề liên quan