2013年3月22日金曜日

C++でJSONを扱う件(3)

C++でJSONを扱う件(3)
JSONファイルそのものをどうやって読めばいいのかって点ですが。。。
ところで話は変わって、【オブジェクト指向】ってあるじゃないですか。
よく、直感的に、思考に近い形でとか言いますよね。
CODINGは、要するに、object指向かどうかが問題なのではなくて、
頭でわかりやすいかどうかです。
単純なものほどわかりやすいのは至極当然。
よって、TREE構造のものを読み込むことを考えたときに、、
全て展開したTREEを、上から1行ずつ読み込んでいくような、そんな感じで読み込みましょう。

ポイントは、いくつかの文字の判定とその分岐です。
考えるのは、、
【"】【:】【{】【}】【[】【]】【,】
の7つだけです。
といったところで、こんな感じでつくってみました。

  1. //wpは文字列の配列  
  2. for(int w=0;wp[w]!=0;w++){  
  3.  if(ダブルクォーテーション){  
  4.   //-----------------------------  
  5.   if(bIn){  
  6.    // ここで文字列が終わるので、文字列の特定  
  7.   }  
  8.   //-----------------------------  
  9.   else{  
  10.    // 文字列の始まりを憶えて置く  
  11.   }  
  12.   //-----------------------------  
  13.   bIn = ! bIn;  
  14.  }  
  15.  if(bIn) continue;//次へ  
  16.  else if(コロン){     // 【:】  
  17.   // キーを確定させる  
  18.   // 値の開始位置を覚える  
  19.  }  
  20.  else if(中カッコ開始){    // 【{】  
  21.   // 現在のobjectをPUSHする  
  22.   // 現在のobjectの下にobjectを生成してそれを現在のobjectにする  
  23.  }  
  24.  else if(中カッコ終了){    // 【}】  
  25.   //キーと値を調べて、少なくとも値があったら現在のobjectに登録  
  26.   //キーは無い場合もある  
  27.   //現在のobjectをひとつPOPする  
  28.  }  
  29.  else if(大カッコ開始){    // 【[】  
  30.   // 現在のobjectをPUSHする  
  31.   // 現在のobjectの下にobjectを生成してそれを現在のobjectにする  
  32.  }  
  33.  else if(大カッコ終了){    // 【]】  
  34.   //キーと値を調べて、少なくとも値があったら現在のobjectに登録  
  35.   //キーは無い場合もある  
  36.   //現在のobjectをひとつPOPする  
  37.  }  
  38.  else if(カンマ){     // 【,】  
  39.   //キーと値を調べて、少なくとも値があったら現在のobjectに登録  
  40.   //キーは無い場合もある  
  41.  }  
  42.  //-----------------------------  
  43. }  
  44. /* 
  45.  ポイント 
  46.  文字列を判断すること 
  47.  キーと値を判断すること 
  48. */  
まぁ、昔ながらのよくある方法ですが、文字列の始まりの【"】のところを憶えておき、終わりの【"】の部分に\0を突っ込んで、char*(wchar_t*)で読むっていう算段です。
値については、【"】ではじまるかどうかで、文字列かどうかを判定するわけですね。
もちろん、このLOOPに入る前に、\\と\"をなんらかの方法で退避させ、値をobjectに登録するときに戻してやりますよ。。

たぶん、つづく。。。

0 件のコメント:

コメントを投稿