많은 사람들이 원하는 것은 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 파서와 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의 매우 구체적인 구현입니다 ....
(다른 답변을 다른 답변에 게시하여 다른 ISO 8601 형식의 PLIST 날짜에 작동해야합니다).
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 날짜가 모두 같은 것은 아닙니다. (적어도 나는 아직 milis를 사용하는 것을 찾지 못했고 파서는 시간대를 완전히 건너 뛰었습니다.)
이제 빠른 버전 (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 파서입니다.
개틀링 퍼포먼스 친구들에 의해 독립적으로 검증되었습니다.
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
스트림, 리더, bytes [], char [], CharSequence (StringBuilder, CharacterBuffer) 및 String에 대해 가장 빠른 JSON 구문 분석기가 있습니다.
더 많은 벤치 마크보기 :
https://github.com/RichardHightower/json-parsers-benchmark