이를 대답은 당신이 정말로 파서를 작성하고 필요한 노력을 할 준비가되어 있다고 가정합니다.
정식 JSON 사양부터 시작해야합니다. 나는 http://www.ietf.org/rfc/rfc4627.txt을 발견했다. 이것은 언어를 정확하게 정의합니다. 사양의 모든 것을 구현하고 테스트를 작성해야합니다. 파서는 (당신처럼) 잘못된 JSON을 처리하고 예외를 throw해야합니다.
파서를 작성하려면 중지하고 생각한 다음 수행하지 마십시오. 올바르게 작동하려면 많은 작업이 필요합니다. 여러분이 무엇을 하든지, 제대로 된 일을하십시오 - 불완전한 파서는 위협이며 절대 배포되어서는 안됩니다.
준수하는 코드를 작성해야합니다. 사양의 일부 구문은 다음과 같습니다. 당신이 그들을 이해하지 않으면 당신은주의 깊게 연구하고 이해하도록해야 할 것이다 ". JSON 텍스트가 유니 코드로 인코딩되어야합니다 기본 인코딩이 UTF-8입니다."
이
"JSON 구문 분석기는 JSON 문법을 준수하는 모든 텍스트를 허용해야합니다."
"인코딩 고려 사항 : UTF-8 인 경우 8 비트; 진 UTF-16 또는
JSON may be represented using UTF-8, UTF-16, or UTF-32. When JSON
is written in UTF-8, JSON is 8bit compatible. When JSON is
written in UTF-16 or UTF-32, the binary content-transfer-encoding
must be used.
"
"UTF-32은 모든 문자가 이스케이프 할 수 있습니다합니다. 문자의 기본
다국어 평면 (U + FFFF 통해 U + 0000)의 경우,이 여섯 문자 시퀀스로서 표현
수있다 : 역방향 사선 뒤에 소문자 U 의해
따라 문자의 코드 포인트를
인 코드 네 개의 16 진수.
F의 16 진수 문자 A는 대문자 나 소문자 일 수 있습니다. 따라서 예를 들어,
한 개의 역 상보 문자 만 포함하는 문자열은
"\ u005C"로 표시 될 수 있습니다. "
당신은이를 잘 이해하고 있으며, 그 다음 다른 파서를 검토하고 그 중 하나는 적합성 테스트가 있는지. 자신의 응용 프로그램에 대한 이러한 대출.
을 여전히있는 경우, 파서를 작성하려면 예를 들어 JAVACC, CUP 및 필자가 선호하는 도구 인 ANTLR을 사용하는 것이 좋습니다. ANTLR은 매우 강력하지만 처음에는 사용하기가 어려울 수 있습니다 .Palboiled의 제안을 참조하십시오 .JSON은 상대적으로 간단하고 유용한 연습이 될 것입니다. 대부분의 파서 생성기는 JSON의 실행 가능 코드를 생성하거나 구문 분석 트리를 생성 할 수있는 완벽한 파서를 생성합니다.
당신이 그것을 들여다 볼 수 있다면, http://www.antlr.org/wiki/display/ANTLR3/JSON+Interpreter에 ANTLR을 사용하는 JSON 파서 생성기가 있습니다. 나는 또한 Parboiled parser-generator for JSON을 발견했습니다. 파서를 작성하는 주된 이유가 파서를 작성하는 방법을 배우는 경우, 이는 아마도 좋은 출발점 일 것입니다.
파서 - 생성기를 사용할 수 없거나 사용하고 싶지 않으면 자신 만의 파서를 만들어야합니다. 일반적으로 두 부분으로 나뉩니다 :
lexer/tokenizer. 이것은 언어 스펙에 정의 된 기본 프리미티브를 인식합니다. 이 경우 중괄호, 따옴표 등을 인식해야합니다. 아마도 숫자의 표현을 구성 할 수도 있습니다.
추상 구문 트리 (http://en.wikipedia.org/wiki/Abstract_syntax_tree, AST) 발생기. 여기서 JSON의 추상화를 나타내는 트리를 어셈블하는 코드를 작성합니다 (예 : 공백 및 중괄호는 삭제됨).
AST가있을 때 노드를 반복하고 원하는 출력을 만들어야합니다.
JSON과 같은 간단한 언어의 경우에도 구문 분석기 생성기를 작성하는 것은 많은 작업입니다.
왜 [Gson] (https://code.google.com/p/google-gson/)을 사용하지 않습니까? –
이것은 유효한 JSON이 아닙니다! – fge
[무엇을 시도해 봤습니까?] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) 지금까지 묻지 말고? –