ゼロベースのJSONライブラリー
プロジェクトアドレスjsoncpp、このプロジェクトはされていますleptjsonはのみ使用することを学ぶための、最も基本的な機能を実現するために触発。
- 単純な解析を(提供)とを生成()メソッドJSONテキストをオブジェクトに解析され、そしてその逆
- のみJSONとJSONテキスト抽象構文木変換のプリミティブ型の値をサポートしています
- 標準C / C ++言語を使用して(C ++ 11)
- 私たちは、サードパーティ製のライブラリに依存しません
スタート
このプロジェクトは、インストールされている(サポートC ++ 11)はgcc4.8以降が必要開始します
rm *.o
rm start
g++ -w -c -std=c++11 jsonValue.cpp
g++ -w -c -std=c++11 jsonGenerator.cpp
g++ -w -c -std=c++11 jsonParser.cpp
g++ -w -c -std=c++11 test.cpp
g++ -w jsonValue.o jsonGenerator.o jsonParser.o test.o -o start
./start
予備エントリー
その後、我々は簡単な問題いくつかのJSONテキストを解決する方法で始まりについて考え始めることができます。
1は、配列を取得する方法を求めて「[1,2,3]」長いテキスト、与えられましたか?
私たちは、長いテキストに対処するために呼び出された連続関数を解決したい場合は、分析関数は、2つの段階で実現が必要:
- STEP1の解析テキストおよびテキスト・ポインタを更新します。
- 分析結果が返された場合STEP2正常に解決します。
ここでは分析関数は最後に3回、最後の出会いを「]」呼び出す必要があります
class Parser{
char *txt;
int parse_value() {
/* 解析txt上下文 */
/* 返回一个数值 */
}
}
int main() {
/* 建立parser */
while (*parser.txt != ']') {
array[i] = parser.parse_value();
}
}
長いテキスト与えられた2、 "[1、2、[4,5]]" は、木を取得する方法を尋ねますか?
同様に、最後に分析関数を3回、最後の出会いを「]」を呼び出す必要があります
typedef struct {
int number;
vector<Node* > array;
} TreeNode
class Parser{
char* txt;
TreeNode* parse_value() {
/* 解析txt上下文 */
/* 返回一个节点 */
}
}
int main() {
/* 建立parser */
/* 建立树根 */
while (*parser.txt != ']') {
root.array[i] = parser.parse_value();
}
}
分析に長いテキストが完了した後、次に達成するために分析関数自体を検討します。「1」、「2」を直接解決することができ、「[4,5]」ながら、再帰呼び出しを行うために、長いテキストとして見ることができます。
Iは、オブジェクト指向設計を採用している上記のプロセスは、各操作は、オブジェクトの関数です。もちろん、我々はまた、プロセス指向の考え方を採用することができますが、TXTテキスト各関数のポインタ、または参照の使用を着信アドレス宛に確認してください。
3、ツリーを取得する方法を求めて、長いテキストJSONを与えられましたか?
プロジェクトjsoncppはこの質問への答えです。