2012-04-25 16 views
7

Zastanawiam się, jak ustawić dzisiejszą datę w pliku json, jak używamy w js.definiowanie daty w pliku json

Czy istnieje opcja określenia Date.today() w pliku json?

Ponieważ dane json mają obiekt daty, który określa datę systemową za każdym razem, gdy odczytamy plik json.

Mam nadzieję, że zrozumiesz, co próbuję powiedzieć.

Dzięki z góry,

-Raja.

+0

Skąd pochodzi plik json i co zamierzasz zrobić z jego zawartością? Czy zawiera tylko wartości, które będziesz używał w kodzie javascript, czy też będzie generował dane wyjściowe (takie jak HTML) z danych? – Julian

+0

Potrzebuję uzyskać datę i wykonać pewne obliczenia w html stronie –

+0

naprawdę nie dostaję twojego problemu. Czytałem komentarze, które napisałeś, ale czy mógłbyś podać nieco więcej o czym jest twój problem? Być może przykład, dlaczego tego potrzebujesz. - dziękuje – Neysor

Odpowiedz

8

JSON to zorganizowany format transportu. Nie zawiera w sobie logiki.

Ale oto opcje:

  1. Dlaczego nie po prostu datę, kiedy czytasz ten plik zamiast?

  2. Niech serwer wygeneruje JSON zawierający datę, w której został wygenerowany. Jednak nie jest to idealne, jeśli chcesz bieżącą datę. Do czasu odczytania pliku data wygenerowana przez serwer już minęła.

  3. zbudować analizator składniowy, który analizuje ciąg znaków i sprawić, by wyszukiwał niestandardowy znacznik.

For example specjalne znaczniki są zawarte w @{}. Pobierz polecenie wewnątrz, określ polecenie i wykonaj wymianę.

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

W tym przypadku, znajdę @{currentdate}. należy utworzyć funkcję odpowiadającą tej komendy zastąpić @{currentdate} do bieżącej daty podczas odczytu (w formacie chcesz)

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

a wynik jest taki:

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

Nie tylko jedna data. Mam wiele obiektów daty w danych json. Uzyskanie daty podczas czytania nie jest dobre. Muszę to zrobić w samym jsonie. Czy jest jakiś inny sposób? –

+1

@RajaGopal mają serwer generujący plik json, aby mógł dołączyć aktualną wygenerowaną datę. AFAIK, JSON nie zawiera logiki. to tylko format transportu. – Joseph

+0

Czy możesz wyjaśnić, jak zrobić 3 punkt? –

1

nie byłoby być łatwiejszym po prostu obliczyć bieżące dane systemowe po przeczytaniu pliku? Być może brakuje tu kontekstu, ale nie widzę sensu w przechowywaniu tego w dokumencie.

Jeśli naprawdę trzeba zrobić, więc można zrobić w następujący sposób

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

To nie działa, gdy dane json mają Hierarchię. Muszę to zrobić na samym jsonie. Czy jest jakiś inny sposób? –

+0

@RajaGopal Powinieneś wyjaśnić, co masz na myśli przez "Problem hierarchii". Czy w twoim obiekcie Json może wystąpić wiele wpisów "data" na różnych głębokościach? – Julian

+0

moje dane json powinny być takie, [{"data1": "foo", "Data": "", "childs": [{"data2": "stos", "Data": ""} {} { } ..]}] i tak na –

1

Jeśli chcesz zapisać datę, wolałbym, aby zapisać jako ciąg z formatu jak rrrr/mm DD HH /: mm: ss lub coś podobnego, i parsuj go w obiekcie Date, kiedy chcę go przeczytać w języku, którego potrzebuję.

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

Nie rozumiem dokładnie, co chcesz, z metody eval (jest to brzydki zwyczaj), można dodać metodę stawia rzeczywistą datę w obiekcie, a także zwiększa się u dzieci i nazywają metoda dodana u dzieci.

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 jeśli chcesz zapisać go w pliku, a następnie trzeba użyć metody eval (nie zalecane) magazynowanie metody jako ciąg lub evry czasu załadować plik zrobić

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

nie można łączyć obiektów json z funkcjami, dlatego w drugiej metodzie po dodaniu metody addDate, usuwamy ją z obiektu json (można również usunąć delete.addDate, ale nie wiem, czy działa w IE)

10

Strona serwera może generować daty JSON w formacie ISO, na przykład " 2012-04-30T02: 15: 12.356Z” Następnie po stronie klienta można analizować i załadować do obiektu Date

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

Można rozważyć wykorzystanie popularnej biblioteki jak moment.js http://momentjs.com/

Następnie można zapisać jako datę YYYY-MM-DD w json i niech chwila obsłużyć parsowania:

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

i sugerują, że należy rozważyć użycie JSON-js (json2.js) parser, ponieważ analizuje wszystkie standardowe JSON, ale także pozwala na dodawanie niestandardowych par logika obsługi se, zwana funkcją reviver, która bardzo dobrze pasuje do scenariusza. Podstawowa składnia do wywoływania parsera JSON z niestandardowego przewodnika wygląda następująco:

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

Korzystanie z przykładową wejście jako przewodnik, to może być skonfigurowane do pracy tak:

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

Ogólne wprowadzenie do JSON-js jest dostępne na stronie JSON in JavaScript page wraz z krótkimi informacjami wstępnymi na temat JSON, a strona zawiera również kilka scenariuszy użycia.

0

to będzie dobre, aby zebrać wszystkie daty, które chcesz przenieść do

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

przekształcenia tej kolekcji do obiektu json i następnie pod koniec receving, przekonwertować go z powrotem do tej pory. Możesz użyć interfejsu API daty i godziny joda do konwersji.

0

Używam Gson w java do tworzenia plików json, ale Gson nie pozwala mi umieścić funkcji javascript w jsonie. Oto, co robię: Użyj tagów zastępujących dla miejsc, w których chcesz umieścić kod (jak jedna z wcześniejszych odpowiedzi). Następnie uzyskać tekst JSON, wymień tagi, a następnie zapisać tekst do pliku 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); 

Więc nie ma nic do zrobienia po stronie wykorzystania w użyciu tego JSON. I pierwsze wyjście jest:

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

Moja wykorzystanie JSON jest zwykle zapisując go jako javascript z cesji, więc to pracuje dla mnie.