XML とともに JSON というデータ・ベース構造が普及してきている。
Ajax では戻り値が XML であることが基本であったが JSON で戻す場合も許されているし
JQuery では多くの場合、JSON が使われている。
JSON は XML のような構造化照会言語の性格もあるのだが、多くの場合は
一次配列として使われている。
IBM i の DB2/400 に見慣れている開発者にとって JSON はわかりやすい構造である。
【 商品マスター: SHOHIN 】
| コード | 商品名 | 単価 | 品種コード |
|---|---|---|---|
| NV-BS30S | 目次ビデオ | 165,000 | 0002 |
| NV-BS50S | ビデオ画王 | 200,000 | 0002 |
| NV-CF2 | 薄型テレビ | 98,000 | 0003 |
| ・ | ・ | ・ | ・ |
| ・ | ・ | ・ | ・ |
JSON で表現した場合は
{
{
"商品コード" : "NV-BS30S",
"商品名" : "目次ビデオ",
"単価" : "165,000",
"品種ード" : "0002"
}
{
"コード": "NV-BS50S ",
"商品名": "ビデオ画王 ",
"単価": "200,000",
"品種コード": "0002"
}
{
"コード": "NV-CF2",
"商品名": "薄型テレビ",
"単価": "98,000",
"品種コード": "0003"
}
・
・
}
となる。
説明は要らないくらいに簡単である。
しかも JSON の利用場面の多くは 1レコードのみの表現である。
JSON を解析するための JSON パーサーは数多く出回っているが
現実はこの程度なので複雑なパーサーは必要ない。
ここでは最も簡単な JSON パーサーの例を紹介する。
【 TESTJSON 】
0001.00 #include
0002.00 #include
0003.00 #include
0004.00
0005.00 #define TRUE 0
0006.00 #define FALSE -1
0007.00 int readJSON(char* buff, char* key, char* result);
0008.00
0009.00 void main(void){
0010.00 char json[129], result[1025];
0011.00
0012.00 printf("** TESTJSON : JSON の読取り **™n");
0013.00 getchar();
0014.00
0015.00 strcpy(json,
0016.00 "{™
0017.00 ™"name™": ™"PAUL™",™
0018.00 ™"description™": ™"™"™
0019.00 ™"configuration_id™": ™"{configuration_id}™",™
0020.00 ™"language™": ™"en™"™
0021.00 }");
0022.00 printf("[%d] json = ™n[%s]™n", __LINE__, json);
0023.00 readJSON(json, "name", result);
0024.00 printf("[%d] name = [%s]™n", __LINE__, result);
0025.00 getchar();
0026.00 readJSON(json, "language", result);
0027.00 printf("[%d] language = [%s]™n", __LINE__, result);
0028.00 getchar();
0029.00 }
0030.00 /************************************************/
0031.00 int readJSON(char* json, char* key, char* result)
0032.00 /************************************************/
0033.00 {
0034.00 char ckey[128], *ptr, buff[1025];
0035.00 int pos;
0036.00
0037.00 sprintf(ckey, "™"%s™"", key);
0038.00 if((ptr = strstr(json, ckey)) != NULL){/*FOUND*/
0039.00 pos = (int)(ptr - json) + strlen(ckey) +1;
0040.00 while(json[pos] != '"') pos++;
0041.00 while(json[pos] != '"') pos ++;
0042.00 strcpy(buff, &json[pos+1]);
0043.00 buff[1024] = 0x00;
0044.00 if((ptr = strchr(buff, '"')) != NULL){/* 終わり */
0045.00 pos = (int)(ptr - buff);
0046.00 buff[pos] = 0x00;
0047.00 }/* 終わり */
0048.00 strcpy(result, buff);
0049.00 return TRUE;
0050.00 }/*FOUND*/
0051.00 else return FALSE;
0052.00 }

【 解説 】
これは一次元の JSON のみに対応しているので複雑な構造を扱う場合は
これをカスタマイズして欲しい。
関数: readJSON に対して JSON を入力パラメータ: json として与えて
取り出しキー: key を指定するとそのキーに対応する値が result として
戻されるというものである。
