2010-06-30 6 views
4

J'essaie de suivre le tableau chronologique: http://code.google.com/apis/visualization/documentation/gallery/annotatedtimeline.html#Data_Format Les données arrivent sous la forme d'un flux JSON.Comment sortir javascript Date json

Google veut que les données quelque chose comme ceci:

{ 
    version:'0.6', 
    reqId:'0', 
    status:'ok', 
    sig:'4641982796834063168', 
    table:{ 
     cols:[ 
     { 
      id:'A', 
      label:'NEW A', 
      type:'string' 
     }, 
     { 
      id:'B', 
      label:'B-label', 
      type:'number' 
     }, 
     { 
      id:'C', 
      label:'C-label', 
      type:'datetime' 
     } 
     ], 
     rows:[ 
     { 
      c:[ 
       { 
        v:'c' 
       }, 
       { 
        v:3.0, 
        f:'3' 
       }, 
       { 
        v:new Date(2008, 
        3, 
        30, 
        0, 
        31, 
        26     ), 
        f:'4/30/08 12:31 AM' 
       } 
      ] 
     } 
     ] 
    } 
} 

Comment puis-je sortie la fonction Date sans être enveloppé dans délimiteurs de chaîne comme « Date() ».

+1

Comme cela est lié à Google Maps j'ai découvert qu'ils permettent une chaîne de date dans le format "Date (aaaa, mm, jj [, hh, ss, ii])" Les tableaux json nécessite est invalide, car ils utilisent des citations différentes des notes. – Keyo

+0

Oui cela fonctionne! et est la solution la plus simple. c'est à dire.supprimez simplement le mot "nouveau". Keyo Où avez-vous trouvé la chaîne Date spécifiée? Je ne peux pas le voir dans l'API Charts? (J'aimerais savoir si c'est officiel et restera). – scipilot

Répondre

4

J'ai simplement enveloppé les fonctions %% caractères comme ceci:

$something = array('%%new Date(...) %%','somevalue'); 
$json = json_encode($something); 

Et supprimé ces caractères %% et la chaîne délimiteurs à côté d'eux.

$json = preg_replace("/(('|\")%%|%%(\"|'))/",'', $json); 
+0

Bonne réponse. Merci – jribeiro

+0

Notez que cela ne fonctionne que dans une utilisation très étroite. Certaines personnes pourraient atterrir ici pour transmettre JS au sein de JSON via ajax etc. Notez que la transmission de js dans JSON ne fonctionnera pas par défaut (vous aurez besoin d'évaluer la réponse) et b) elle n'est pas destinée à être utilisée comme cette. On pourrait seulement utiliser la solution proposée ici si elle est utilisée dans la sortie d'un fichier de ressource javascript/tag de script. –

1

Malheureusement, il n'y a pas de « date littérale » en JavaScript (les tableaux peuvent être exprimés avec [] et des objets avec {}, mais pas un tel amour pour les objets de date). De plus, les JSON réels et valides n'acceptent que les valeurs primitives (comme les chaînes, les nombres, les tableaux, les booléens, les objets et pas grand-chose d'autre). Vous pourriez également être surpris d'apprendre que le Date() dans JSON n'est pas valide (bien que ce ne soit pas un problème si vous ne vous souciez pas de la portabilité).

Si vous avez le contrôle sur le code qui produit le flux et le consomme, vous voudrez peut-être faire une chose. D'abord, passez la date en tant qu'horodatage. Ceci est assez facile:

var dtDateTime = new Date('Jan 27 2011 00:00:00 GMT+0000'); 
var intDateTime = dtDateTime.getTime(); 
var objJSON = { 
    "datetime":intDateTime 
}; 

Après le chargement du JSON, votre code serait alors analyser le datetime avec:

var dtDateTime = new Date(); 
dtDateTime.setTime(objJson.datetime); 

Ici, votre code devrait attendre la propriété datetime et le savoir pour le décoder. Ce n'est donc pas une bonne solution généralisée.

Une autre façon dont j'ai vu cette fêlure est avec un littéral de chaîne spécial, ce qui signifie pour votre script qu'il s'agit d'un datetime. Il pourrait être la valeur:

var objJSON = { 
    "datetime":"@Jan 27 2011 00:00:[email protected]" 
}; 

Ou peut-être le nom:

var objJSON = { 
    "@datetime":1296086400000 
}; 

Le @ agit simplement comme un drapeau à votre code que la valeur a besoin d'une sorte de post-traitement. Les deux passeront la validation. JSON est conçu pour être simple et multiplate-forme, donc tout ce qui est spécifique à JS est intrinsèquement mauvais. Si vous avez essayé de charger JSON, disons Java ou C#, vous auriez un problème.

0
$data = preg_replace('@new Date\(([^\)]*)\)@', '"$1"', $data); 
    $data = json_decode($data, true); 

Résultat:

new Date (2008,3,30,0,31,26) => "2008,3,30,0,31,26"