2013年3月21日木曜日

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

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

STEP2
で、object型ですが、ここでは簡略化して、以下のように考えます。


struct objson{
    objson* parent; //    親
    objson* child;  //    子
    objson* prev;   //    兄
    objson* next;   //    弟
    char*   value;  //    データ部
    char    dat[4]; //    key部
    //その他いろいろあるけど省略
    objson& operator[](const char* c);   //["abc"]とかのため
    operator char*();                    //キャストするため
    void operator=(char* cp);            //代入するため
};

これは、objectのデータ長さが一定ではないためです。
もちろん、構造体のメンバの中に、VARIANT的な値をもつという方法もありますが、ここでは面倒になるのでやりません。
よって、bool/int/doulbeとかであれば、まぁあっても8バイトなわけなので、最初から確保するという荒業もありますが、文字列だとそうはいきません。
よって、こんな風に生成してみます。
int size = sizeof(objson) + strlen(moji) + strlen(key);
char* p = new char[size];
memset(p,0,size);
objson* o = (objson*)p;


keyを設定するには、datへcopy、値を設定するには、valueのポインタを設定してからstrcpyします。
strcpy(o->dat,key);
o->value = &o->dat[strlen(key)+1];
strcpy(o->value,value);

長さを算定してメモリを確保し、それにobjson*でキャストしています。

例えば、メモリ管理を自分で書けば、メモリを連続させたりすることもできるし、不要なnew-deleteを考えなくてもすみます。

ここでは、keyになる文字列と値になる文字列の分を足して、メモリを確保しています。


生成したあとは、parent/child/prev/nextを設定して階層をつくってやれば、
o->child->child->child
なんて指定も可能になります。

つづく。。

0 件のコメント:

コメントを投稿