C/400

125. JSON パーサー

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 として
戻されるというものである。