Saya pikir apa yang banyak orang ingin lakukan adalah mengurai string tanggal JSON. Ada kemungkinan besar jika Anda mengunjungi halaman ini bahwa Anda mungkin ingin mengonversi tanggal JSON JavaScript ke tanggal Java.
Untuk menampilkan seperti apa string tanggal JSON:
var d=new Date();
var s = JSON.stringify(d);
document.write(s);
document.write("<br />"+d);
"2013-12-14T01:55:33.412Z"
Fri Dec 13 2013 17:55:33 GMT-0800 (PST)
String tanggal JSON adalah 2013-12-14T01: 55: 33.412Z.
Tanggal tidak dicakup oleh spesifikasi JSON per katakan, tetapi di atas adalah format ISO 8601 yang sangat spesifik, sedangkan ISO_8601 jauh lebih besar dan itu hanyalah sebagian kecil meskipun sangat penting.
Lihat http://www.json.org
Lihat http://en.wikipedia.org/wiki/ISO_8601
Lihat http://www.w3.org/TR/NOTE-datetime
Seperti yang terjadi saya menulis parser JSON dan parser PLIST yang keduanya menggunakan ISO-8601 tetapi tidak bit yang sama.
/*
var d=new Date();
var s = JSON.stringify(d);
document.write(s);
document.write("<br />"+d);
"2013-12-14T01:55:33.412Z"
Fri Dec 13 2013 17:55:33 GMT-0800 (PST)
*/
@Test
public void jsonJavaScriptDate() {
String test = "2013-12-14T01:55:33.412Z";
Date date = Dates.fromJsonDate ( test );
Date date2 = Dates.fromJsonDate_ ( test );
assertEquals(date2.toString (), "" + date);
puts (date);
}
Saya menulis dua cara untuk melakukan ini untuk proyek saya. Satu standar, satu cepat.
Sekali lagi, string tanggal JSON adalah implementasi ISO 8601 yang sangat spesifik ....
(Saya memposting yang lain di jawaban lain yang harus bekerja untuk tanggal PLIST, yang merupakan format ISO 8601 yang berbeda).
Tanggal JSON adalah sebagai berikut:
public static Date fromJsonDate_( String string ) {
try {
return new SimpleDateFormat ( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX").parse ( string );
} catch ( ParseException e ) {
return Exceptions.handle (Date.class, "Not a valid JSON date", e);
}
}
File PLIST (ASCII non GNUNext) juga menggunakan ISO 8601 tetapi tidak ada milidetik jadi ... tidak semua tanggal ISO-8601 adalah sama. (Setidaknya saya belum menemukan yang menggunakan milis dan parser yang saya lihat melewati zona waktu sama sekali OMG).
Sekarang untuk versi cepat (Anda dapat menemukannya di Boon).
public static Date fromJsonDate( String string ) {
return fromJsonDate ( Reflection.toCharArray ( string ), 0, string.length () );
}
Perhatikan bahwa Reflection.toCharArray menggunakan tidak aman jika tersedia tetapi default ke string.toCharArray jika tidak.
(Anda bisa mengeluarkannya dengan mengganti Reflection.toCharArray (string) dengan string.toCharArray ()).
public static Date fromJsonDate( char[] charArray, int from, int to ) {
if (isJsonDate ( charArray, from, to )) {
int year = CharScanner.parseIntFromTo ( charArray, from + 0, from + 4 );
int month = CharScanner.parseIntFromTo ( charArray, from +5, from +7 );
int day = CharScanner.parseIntFromTo ( charArray, from +8, from +10 );
int hour = CharScanner.parseIntFromTo ( charArray, from +11, from +13 );
int minute = CharScanner.parseIntFromTo ( charArray, from +14, from +16 );
int second = CharScanner.parseIntFromTo ( charArray, from +17, from +19 );
int miliseconds = CharScanner.parseIntFromTo ( charArray, from +20, from +23 );
TimeZone tz = TimeZone.getTimeZone ( "GMT" );
return toDate ( tz, year, month, day, hour, minute, second, miliseconds );
} else {
return null;
}
}
IsJsonDate diimplementasikan sebagai berikut:
public static boolean isJsonDate( char[] charArray, int start, int to ) {
boolean valid = true;
final int length = to -start;
if (length != JSON_TIME_LENGTH) {
return false;
}
valid &= (charArray [ start + 19 ] == '.');
if (!valid) {
return false;
}
valid &= (charArray[ start +4 ] == '-') &&
(charArray[ start +7 ] == '-') &&
(charArray[ start +10 ] == 'T') &&
(charArray[ start +13 ] == ':') &&
(charArray[ start +16 ] == ':');
return valid;
}
Ngomong-ngomong ... tebakan saya adalah bahwa beberapa orang yang datang ke sini .. mungkin mencari JSON Date String dan meskipun ini adalah tanggal ISO-8601, itu adalah yang sangat spesifik yang membutuhkan penguraian yang sangat spesifik.
public static int parseIntFromTo ( char[] digitChars, int offset, int to ) {
int num = digitChars[ offset ] - '0';
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
if ( ++offset < to ) {
num = ( num * 10 ) + ( digitChars[ offset ] - '0' );
}
}
}
}
}
}
}
}
return num;
}
Lihat https://github.com/RichardHightower/boon
Boon memiliki pengurai PLIST (ASCII) dan pengurai JSON.
Pengurai JSON adalah pengurai Java JSON tercepat yang saya tahu.
Diverifikasi secara independen oleh dudes Kinerja Gatling.
https://github.com/gatling/json-parsers-benchmark
Benchmark Mode Thr Count Sec Mean Mean error Units
BoonCharArrayBenchmark.roundRobin thrpt 16 10 1 724815,875 54339,825 ops/s
JacksonObjectBenchmark.roundRobin thrpt 16 10 1 580014,875 145097,700 ops/s
JsonSmartBytesBenchmark.roundRobin thrpt 16 10 1 575548,435 64202,618 ops/s
JsonSmartStringBenchmark.roundRobin thrpt 16 10 1 541212,220 45144,815 ops/s
GSONStringBenchmark.roundRobin thrpt 16 10 1 522947,175 65572,427 ops/s
BoonDirectBytesBenchmark.roundRobin thrpt 16 10 1 521528,912 41366,197 ops/s
JacksonASTBenchmark.roundRobin thrpt 16 10 1 512564,205 300704,545 ops/s
GSONReaderBenchmark.roundRobin thrpt 16 10 1 446322,220 41327,496 ops/s
JsonSmartStreamBenchmark.roundRobin thrpt 16 10 1 276399,298 130055,340 ops/s
JsonSmartReaderBenchmark.roundRobin thrpt 16 10 1 86789,825 17690,031 ops/s
Ini memiliki parser JSON tercepat untuk stream, pembaca, byte [], char [], CharSequence (StringBuilder, CharacterBuffer), dan String.
Lihat lebih banyak tolok ukur di:
https://github.com/RichardHightower/json-parsers-benchmark