আমি মনে করি অনেক লোক যা করতে চায় তা হল 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।
তারিখগুলি প্রতি কথায় জেএসএন স্পেক দ্বারা আচ্ছাদিত নয়, তবে উপরেরটি একটি খুব নির্দিষ্ট আইএসও 8601 ফর্ম্যাট, যখন আইএসও_৮60০১ অনেক বড় এবং এটি খুব গুরুত্বপূর্ণ একটি সবেমাত্র সাবসেট।
দেখুন http://www.json.org
দেখুন http://en.wikipedia.org/wiki/ISO_8601
দেখুন http://www.w3.org/TR/NOTE-datetime
এটি হওয়ার সাথে সাথে আমি একটি জেএসএন পার্সার এবং একটি প্লিজিএস পার্সার লিখেছিলাম যার উভয়ই আইএসও -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);
}
আমি আমার প্রকল্পের জন্য এটি করার দুটি উপায় লিখেছি। একটি মান, একটি দ্রুত।
আবার, জেএসওএন তারিখ স্ট্রিংটি আইএসও 8601 এর খুব নির্দিষ্ট প্রয়োগ implementation
(আমি অন্য একটিতে অন্য উত্তরে পোস্ট করেছি যা পিআইএলএসটি তারিখগুলির জন্য কাজ করা উচিত, যা ভিন্ন আইএসও 8601 ফর্ম্যাট)।
জেএসওএন তারিখটি নিম্নরূপ:
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);
}
}
প্লিস্ট ফাইলগুলি (এএসসিআইআই নন জিএনইউএনেক্সট) এছাড়াও আইএসও 8601 ব্যবহার করে তবে কোনও মিলিসেকেন্ড তাই না ... সমস্ত আইএসও -8601 তারিখ একই নয়। (কমপক্ষে আমি মিলিস ব্যবহার করে এমন একটি এখনও খুঁজে পাইনি এবং আমি যে পার্সারটি দেখেছি তা সম্পূর্ণভাবে ওএমজি টাইমজোন এড়িয়ে যেতে পারে)।
এখন দ্রুত সংস্করণের জন্য (এটি আপনি বুনে খুঁজে পেতে পারেন)।
public static Date fromJsonDate( String string ) {
return fromJsonDate ( Reflection.toCharArray ( string ), 0, string.length () );
}
মনে রাখবেন যে প্রতিবিম্ব. টোচারআরারি উপলভ্য থাকলে অনিরাপদ ব্যবহার করে তবে স্ট্রিং. টোচারআররে ডিফল্ট হয়।
(আপনি এটি রিফ্লেকশন. টোচারআরে (স্ট্রিং) কে স্ট্রিং.টোচারআরে ()) দিয়ে প্রতিস্থাপনের মাধ্যমে উদাহরণের বাইরে নিয়ে যেতে পারেন।
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;
}
যাইহোক ... আমার অনুমান যে এখানে আসা বেশ কয়েক জন লোকই সম্ভবত জেএসএন ডেট স্ট্রিং খুঁজছেন এবং এটি একটি আইএসও -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 দেখুন
বুনের একটি পিআইএলএসটি পার্সার (এএসসিআইআই) এবং জেএসএন পার্সার রয়েছে।
JSON পার্সার হ'ল জাভা জেএসএন পার্সার আমি জানি know
গ্যাটলিং পারফরম্যান্স ডিউড দ্বারা স্বতন্ত্রভাবে যাচাই করা হয়েছে।
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
এটিতে স্রোত, পাঠক, বাইটস [], চর [], চারসেকেন্স (স্ট্রিংবিল্ডার, ক্যারেক্টারবাফার) এবং স্ট্রিংয়ের জন্য দ্রুতগতিতে জেএসএন পার্সার রয়েছে।
আরও মানদণ্ড এখানে দেখুন:
https://github.com/RichardHightower/json-parsers-benchmark