Tôi nghĩ điều mà nhiều người muốn làm là phân tích các chuỗi ngày JSON. Có một cơ hội tốt nếu bạn đến trang này mà bạn có thể muốn chuyển đổi ngày JavaScript JSON thành ngày Java.
Để hiển thị chuỗi ngày JSON trông như thế nào:
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)
Chuỗi ngày JSON là 2013-12-14T01: 55: 33.412Z.
Các ngày không được bao phủ bởi thông số JSON mỗi lần nói, nhưng ở trên là định dạng ISO 8601 rất cụ thể, trong khi ISO_8601 lớn hơn nhiều và đó chỉ là một tập hợp con mặc dù là một tập hợp rất quan trọng.
Xem http://www.json.org
Xem http://en.wikipedia.org/wiki/ISO_8601
Xem http://www.w3.org/TR/NOTE-datetime
Khi nó xảy ra, tôi đã viết một trình phân tích cú pháp JSON và trình phân tích cú pháp PLIST cả hai đều sử dụng ISO-8601 nhưng không phải là các bit giống nhau.
/*
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);
}
Tôi đã viết hai cách để làm điều này cho dự án của tôi. Một tiêu chuẩn, một nhanh chóng.
Một lần nữa, chuỗi ngày JSON là một triển khai rất cụ thể của ISO 8601 ....
(Tôi đã đăng một câu hỏi khác trong câu trả lời khác nên hoạt động cho các ngày PLIST, định dạng ISO 8601 khác).
Ngày JSON như sau:
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);
}
}
Các tệp PLIST (ASCII non GNUNext) cũng sử dụng ISO 8601 nhưng không có milis giây nên ... không phải tất cả các ngày ISO-8601 đều giống nhau. (Ít nhất là tôi chưa tìm thấy cái nào sử dụng milis và trình phân tích cú pháp mà tôi đã thấy bỏ qua múi giờ hoàn toàn OMG).
Bây giờ cho phiên bản nhanh (bạn có thể tìm thấy nó trong Boon).
public static Date fromJsonDate( String string ) {
return fromJsonDate ( Reflection.toCharArray ( string ), 0, string.length () );
}
Lưu ý rằng Reflection.toCharArray sử dụng không an toàn nếu có nhưng mặc định là string.toCharArray nếu không.
(Bạn có thể lấy nó ra khỏi ví dụ bằng cách thay Reflection.toCharArray (chuỗi) bằng chuỗi.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 được triển khai như sau:
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;
}
Dù sao ... tôi đoán là có khá nhiều người đến đây .. có thể đang tìm kiếm Chuỗi ngày JSON và mặc dù đó là ngày ISO-8601, đây là một ngày rất cụ thể cần một phân tích rất cụ thể.
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;
}
Xem https://github.com/RichardHightower/boon
Boon có trình phân tích cú pháp PLIST (ASCII) và trình phân tích cú pháp JSON.
Trình phân tích cú pháp JSON là trình phân tích cú pháp Java nhanh nhất mà tôi biết.
Xác nhận độc lập bởi các anh chàng hiệu suất 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
Nó có trình phân tích cú pháp JSON nhanh nhất cho các luồng, trình đọc, byte [], char [], CharSequence (StringBuilder, CharacterBuffer) và String.
Xem thêm điểm chuẩn tại:
https://github.com/RichardHightower/json-parsers-benchmark