मुझे लगता है कि जो लोग बहुत कुछ करना चाहते हैं, वह JSON तारीख के तार हैं। इस पृष्ठ पर आने का एक अच्छा मौका है कि आप जावास्क्रिप्ट JSON दिनांक को जावा तिथि में परिवर्तित करना चाहते हैं।
यह दिखाने के लिए कि 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 कल्पना द्वारा तिथियां कवर नहीं की जाती हैं, लेकिन ऊपर एक बहुत विशिष्ट आईएसओ 8601 प्रारूप है, जबकि ISO_8601 बहुत बड़ा है और यह एक बहुत ही महत्वपूर्ण है।
देखें http://www.json.org
देखें http://en.wikipedia.org/wiki/ISO_8601
देखें http://www.w3.org/TR/NOTE-datetime
जैसा कि होता है मैंने एक JSON पार्सर और एक PLIST पार्सर लिखा है जिसमें दोनों 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 का एक बहुत ही विशिष्ट कार्यान्वयन है ...।
(मैंने दूसरे उत्तर में एक पोस्ट किया है जो पीएलआईएसटी तारीखों के लिए काम करना चाहिए, जो एक अलग आईएसओ 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 non GNUNext) भी ISO 8601 का उपयोग करती हैं, लेकिन कोई भी मिलिसेकंड नहीं होता है ... सभी ISO-8601 तिथियां समान नहीं होती हैं। (कम से कम मुझे अभी तक मिलिस का उपयोग करने वाला एक नहीं मिला है और मैंने जिस पार्सर को टाइमजोन को पूरी तरह से ओएमजी छोड़ते देखा है)।
अब तेज संस्करण के लिए (आप इसे बून में पा सकते हैं)।
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
बून में एक PLIST पार्सर (ASCII) और एक JSON पार्सर है।
JSON पार्सर सबसे तेज़ जावा JSON पार्सर है जिसे मैं जानता हूँ।
स्वतंत्र रूप से गैटलिंग प्रदर्शन के दोस्तों द्वारा सत्यापित।
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
इसमें स्ट्रीम, रीडर, बाइट्स [], चार [], चारसेंसेंस (StringBuilder, CharacterBuffer), और स्ट्रिंग के लिए सबसे तेज JSON पार्सर है।
अधिक बेंचमार्क यहां देखें:
https://github.com/RichardHightower/json-parsers-benchmark