2012-04-25 18 views
7

Me pregunto cómo configurar la fecha de hoy en el archivo json como lo estamos usando en js.definiendo la fecha en el archivo json

¿Existe alguna opción para especificar Date.today() en el archivo json?

Porque, los datos json tienen un objeto de fecha que especifica la fecha del sistema cada vez que leemos el archivo json.

Espero, entenderás lo que estoy tratando de decir.

Gracias de antemano,

-Raja.

+0

¿De dónde viene el archivo json y qué vas a hacer con su contenido? ¿Simplemente contiene los valores que va a usar dentro de su código de JavaScript o también va a generar resultados (como HTML) a partir de los datos? – Julian

+0

Necesito obtener la fecha y tengo que realizar algunos cálculos en el lado html –

+0

Realmente no entiendo su problema. Leí los comentarios que hizo, pero ¿podría especificar un poco más cuál es su problema? Quizás un ejemplo, por qué lo necesitas. - Gracias – Neysor

Respuesta

8

JSON es un formato de transporte estructurado. No tiene lógica en eso.

Pero aquí son opciones:

  1. ¿Por qué no obtener la fecha cuando se lee el archivo en su lugar?

  2. Haga que un servidor genere ese JSON que incluya la fecha en la que se generó. Sin embargo, esto no es ideal si quieres la fecha actual. En el momento en que lee el archivo, la fecha generada por el servidor ya ha pasado.

  3. construye un analizador que analiza una cadena y la hace buscar una marca personalizada.

For example, etiquetas especiales está contenida en @{}. Obtenga el comando adentro, determine el comando y ejecute el reemplazo.

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

En este caso, encontraré @{currentdate}. Debería crear una función que corresponde a este comando para reemplazar @{currentdate} en la fecha actual durante la lectura (en el formato que desee)

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

y el resultado es la siguiente:

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

No solo una fecha. Tengo muchos objetos de fecha en datos JSON. Obtener la fecha mientras lee no es bueno. Necesito hacerlo en json mismo. ¿Hay alguna otra manera? –

+1

@RajaGopal haga que un servidor genere el archivo json, para que pueda agregar la fecha generada actual. AFAIK, JSON no contiene lógica. es solo un formato de transporte. – Joseph

+0

¿Podría explicarme cómo hacer el tercer punto? –

1

¿No sería ¿Será más fácil simplemente calcular los datos actuales del sistema cada vez que lea el archivo? Puede que carezca de contexto aquí, pero no veo el sentido de guardar eso en el documento.

Si realmente tiene que hacer lo que puede hacer de la siguiente manera

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

Esto no funciona cuando los datos json tienen jerarquía. Necesito hacerlo en json. ¿Hay alguna otra manera? –

+0

@RajaGopal Debes aclarar a qué te refieres con el "problema de jerarquía". ¿Es el caso que múltiples entradas de "fecha" pueden ocurrir a varias profundidades en su objeto json? – Julian

+0

mis datos json deberían ser así, [{"data1": "foo", "Date": "", "childs": [{"data2": "stack", "Date": ""} {} { } ..]}] y así sucesivamente –

1

Si desea almacenar la fecha, yo preferiría para almacenar como una cadena con un formato como aaaa/mm/dd hh: mm: ss o algo así, y analizarlo en un objeto Date cuando quiero leerlo en el idioma que necesito.

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

no entiendo exactamente lo que quiere, con métodos eval (que es una práctica feo), se puede añadir un método para pone la fecha real en el objeto, y también añade a sí mismo a los niños y llamar a la método agregado en los niños.

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 si desea almacenar en un archivo, entonces usted tiene que utilizar el método eval (no se recomienda) que almacena los métodos como una cadena o Evry tiempo se carga el archivo de hacer

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

no se pueden codificar los objetos json con funciones, debido a esto, en el segundo método después de agregar el método addDate, lo eliminamos del objeto json (también se puede eliminar this.addDate, pero no sé si funciona en IE)

10

El lado del servidor puede generar fechas JSON en formato ISO, por ejemplo " 2012-04-30T02: 15: 12.356Z" Entonces lado del cliente puede analizar y cargar en objeto de fecha

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

se puede considerar el aprovechamiento de la biblioteca popular como moment.js http://momentjs.com/

A continuación, puede almacenar la fecha como AAAA-MM-DD en JSON y deja manejar momento del análisis:

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

sugiero que se tiene en cuenta el uso de la (json2.js) JSON-js analizador, ya que analiza todo JSON estándar, sino que también le permite añadir la par personalizada Se maneja la lógica, llamada función reviver, que se adapta muy bien a su situación. La sintaxis básica para invocar el analizador JSON con un controlador personalizado es el siguiente:

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

Uso de la entrada de ejemplo como guía, podría configurarse para funcionar así:

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

Se proporciona una introducción general a JSON-js en el JSON in JavaScript page, junto con una breve introducción sobre JSON, y la página también incluye algunos escenarios de uso.

0

que será bueno para recoger todas las fechas que desee transferir en una Convert

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

esta colección para un objeto JSON y luego, al final de receving, convertirlo de nuevo hasta la fecha. Puede usar la API de fecha y hora joda para las conversiones.

0

Uso Gson en java para crear salida json, pero Gson no me permite poner funciones de javascript en el json. Entonces, esto es lo que hago: use etiquetas de reemplazo para los lugares donde desea colocar el código (como una de las respuestas anteriores). A continuación, obtener el texto de la JSON, reemplace las etiquetas, y luego guardar el texto a su archivo 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); 

Así que no queda nada por hacer en cuanto al consumo en el uso de este JSON. Y la primera salida es:

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

Mi uso de JSON es generalmente guardarlo como Javascript, con una asignación, por lo que este ha estado trabajando para mí.