ฉันคิดว่าสิ่งที่ผู้คนจำนวนมากต้องการทำคือแจงสตริงวันที่ของ JSON มีโอกาสที่ดีหากคุณมาที่หน้านี้ซึ่งคุณอาจต้องการแปลงวันที่ JavaScript JSON เป็นวันที่ Java
วิธีแสดงสตริงวันที่ของ 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)
สตริงวันที่ของ JSON คือ 2013-12-14T01: 55: 33.412Z
วันที่ไม่ได้อยู่ในข้อมูลจำเพาะของ JSON ต่อการพูด แต่ข้างต้นเป็นรูปแบบ ISO 8601 ที่เฉพาะเจาะจงมากในขณะที่ ISO_8601 นั้นมีขนาดใหญ่กว่ามากและนั่นเป็นเพียงส่วนย่อยเท่านั้น
ดูhttp://www.json.org
ดูhttp://en.wikipedia.org/wiki/ISO_8601
ดูhttp://www.w3.org/TR/NOTE-datetime
ในขณะที่มันเกิดขึ้นฉันเขียน JSON parser และ PLIST parser ซึ่งทั้งสองใช้ ISO-8601 แต่ไม่ใช่บิตเดียวกัน
/*
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);
}
ฉันเขียนสองวิธีในการทำสิ่งนี้สำหรับโครงการของฉัน หนึ่งมาตรฐานหนึ่งเร็ว
อีกครั้งสตริงวันที่ JSON เป็นการใช้งานที่เฉพาะเจาะจงมากของ ISO 8601 ....
(ฉันโพสต์ข้อความอื่นในคำตอบอื่นซึ่งควรใช้กับวันที่ PLIST ซึ่งเป็นรูปแบบ ISO 8601 ที่ต่างออกไป)
วันที่ JSON เป็นดังนี้:
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);
}
}
ไฟล์ PLIST (ASCII ไม่ใช่ GNUNext) ก็ใช้ ISO 8601 เช่นกัน แต่ไม่มีมิลลิวินาทีดังนั้น ... ไม่ใช่วันที่ ISO-8601 ทั้งหมดเหมือนกัน (อย่างน้อยฉันก็ไม่พบคนที่ใช้ milis เลยและ parser ที่ฉันได้เห็นข้ามเขตเวลาโดยสิ้นเชิง OMG)
ตอนนี้สำหรับรุ่นที่รวดเร็ว (คุณสามารถค้นหาได้ใน Boon)
public static Date fromJsonDate( String string ) {
return fromJsonDate ( Reflection.toCharArray ( string ), 0, string.length () );
}
โปรดทราบว่า Reflection.toCharArray ใช้ไม่ปลอดภัยหากมี แต่ใช้ค่าเริ่มต้นเป็น string.toCharArray หากไม่ใช่
(คุณสามารถนำมันออกมาจากตัวอย่างโดยแทนที่ Reflection.toCharArray (string) ด้วย 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 มีการใช้งานดังนี้:
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;
}
อย่างไรก็ตาม ... ฉันเดาได้ว่ามีคนไม่กี่คนที่มาที่นี่ .. อาจกำลังมองหาสตริงวันที่ JSON และถึงแม้ว่ามันจะเป็นวันที่ ISO-8601 แต่ก็เป็นวันที่เจาะจงมากที่ต้องใช้การแจงเฉพาะ
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;
}
ดูhttps://github.com/RichardHightower/boon
Boon มีตัวแยกคำแบบ PLIST (ASCII) และตัวแยกวิเคราะห์ JSON
ตัวแยกวิเคราะห์ JSON เป็นตัวแยกวิเคราะห์ Java JSON ที่เร็วที่สุดที่ฉันรู้
ผ่านการตรวจสอบโดย dudes ประสิทธิภาพของ 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
มันมีตัวแยกวิเคราะห์ JSON ที่เร็วที่สุดสำหรับสตรีม, ผู้อ่าน, ไบต์ [], ถ่าน [], CharSequence (StringBuilder, CharacterBuffer) และสตริง
ดูมาตรฐานเพิ่มเติมได้ที่:
https://github.com/RichardHightower/json-parsers-benchmark