此答案假定您确实想编写一个解析器并准备投入所需的工作。
您必须从 JSON 的正式规范开始。我找到了http://www.ietf.org/rfc/rfc4627.txt。这精确地定义了语言。您必须实现规范中的所有内容并为其编写测试。您的解析器必须处理不正确的 JSON(如您的)并抛出异常。
如果您想编写解析器,请停下来思考,然后不要。让它正常工作需要做很多工作。无论你做什么,都要做好它 - 不完整的解析器是一种威胁,永远不应该分发。
您必须编写符合要求的代码。以下是规范中的一些短语。如果您不理解它们,则必须仔细研究并确保您理解:
"JSON 文本应以 Unicode 编码。默认编码为
UTF-8。”
"JSON 解析器必须接受所有符合 JSON 的文本
语法。”
"编码注意事项:如果是 UTF-8,则为 8 位;如果是 UTF-16 或 UTF-32,则为二进制
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.
"
"任何字符都可以转义。如果该字符在 Basic
多语言平面(U+0000 到 U+FFFF),那么它可能是
表示为六个字符的序列:反向固线,后跟
由小写字母 u 后跟四个十六进制数字
对字符的代码点进行编码。虽然是十六进制字母 A
F 可以是大写或小写。因此,例如,包含
的字符串
只有一个反斜线字符可以表示为
“\u005C”。 "
如果你理解了这些并且仍然想编写一个解析器,那么检查一些其他的解析器,看看它们是否有一致性测试。为您自己的应用借用这些。
如果您仍然热衷于,您应该强烈考虑使用解析器生成器。例如 JAVACC、CUP 和我的首选工具 ANTLR。 ANTLR 非常强大,但可能很难开始。另请参阅我现在推荐的 Parboiled 的建议。 JSON 相对简单,这将是一个有用的练习。大多数解析器生成器生成一个完整的解析器,它可以创建可执行代码或生成 JSON 的解析树。
如果允许您查看的话,http://www.antlr.org/wiki/display/ANTLR3/JSON+Interpreter 有一个使用 ANTLR 的 JSON 解析器生成器。我也刚刚发现了一个Parboiled parser-generator for JSON。如果您编写解析器的主要原因是学习如何去做,那么这可能是一个很好的起点。
如果不允许(或不想)使用解析器生成器,那么您必须创建自己的解析器。这通常分为两部分:
词法分析器/标记器。这识别了语言规范中定义的基本原语。在这种情况下,它必须识别大括号、引号等。它可能还会构建数字表示。
A AbstractSyntaxTree(http://en.wikipedia.org/wiki/Abstract_syntax_tree,AST)生成器。在这里,您编写代码来组装代表 JSON 抽象的树(例如,空格和花括号已被丢弃)。
当您拥有 AST 后,应该很容易迭代节点并创建所需的输出。
但是编写解析器生成器,即使是像 JSON 这样简单的语言,也是一项繁重的工作。