XML とともに JSON というデータ・ベース構造が普及してきている。
Ajax では戻り値が XML であることが基本であったが JSON で戻す場合も許されているし
JQuery では多くの場合、JSON が使われている。
JSON は XML のような構造化照会言語の性格もあるのだが、多くの場合は
一次配列として使われている。
IBM i の DB2/400 に見慣れている開発者にとって JSON はわかりやすい構造である。
コード | 商品名 | 単価 | 品種コード |
---|---|---|---|
NV-BS30S | 目次ビデオ | 165,000 | 0002 |
NV-BS50S | ビデオ画王 | 200,000 | 0002 |
NV-CF2 | 薄型テレビ | 98,000 | 0003 |
・ | ・ | ・ | ・ |
・ | ・ | ・ | ・ |
{ { "商品コード" : "NV-BS30S", "商品名" : "目次ビデオ", "単価" : "165,000", "品種ード" : "0002" } { "コード": "NV-BS50S ", "商品名": "ビデオ画王 ", "単価": "200,000", "品種コード": "0002" } { "コード": "NV-CF2", "商品名": "薄型テレビ", "単価": "98,000", "品種コード": "0003" } ・ ・ }
となる。
説明は要らないくらいに簡単である。
しかも JSON の利用場面の多くは 1レコードのみの表現である。
JSON を解析するための JSON パーサーは数多く出回っているが
現実はこの程度なので複雑なパーサーは必要ない。
ここでは最も簡単な JSON パーサーの例を紹介する。
0001.00 #include0002.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 として
戻されるというものである。