著者:後藤大地
これまで、JSONデータを読み込んで処理する方法を取り上げてきた。JSONデータをパースしながら処理する方法や、メモリー上に展開したJSONデータを、指定したフォーマットで出力する方法を解説した。今回も引き続き同じ「Jansson」ライブラリを使うが、JSONデータを読み込んで処理するのではなく、生成する方法を紹介する。
シェルスクリプトマガジン Vol.57は以下のリンク先でご購入できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <jansson.h> int main(int argc, char *argv[]) { // JSONデータを生成 json_t *root = json_pack("{}"); // JSONデータをエンコードして標準出力へ出力 json_dump_file(root, "/dev/stdout", 0); // JSONメモリー解放 json_decref(root); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <jansson.h> int main(int argc, char *argv[]) { // JSONデータを生成 json_t *root = json_pack("{s:i, s:i}", "鍵1", 510, "鍵2", 0); // JSONデータをエンコードして標準出力へ出力 json_dump_file(root, "/dev/stdout", 0); // JSONメモリー解放 json_decref(root); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Image": { "幅": 800, "高さ": 600, "タイトル": "View from 15th Floor", "サムネイル": { "Url": "http://www.example.com/image/481989943", "高さ": 125, "幅": 100 }, "アニメーション" : false, "IDs": [116, 943, 234, 38793] } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <jansson.h> int main(int argc, char *argv[]) { // JSONデータを生成 json_t *root = json_pack( "{s:{s:i,s:i,s:s,s:{s:s,s:i,s:i},s:b,s:[i,i,i,i]}}", "Image", "幅", 800, "高さ", 600, "タイトル", "View from 15th Floor", "サムネイル", "Url", "http://www.example.com/image/481989943", "高さ", 125, "幅", 100, "アニメーション", 0, "IDs", 116, 943, 234, 38793 ); // JSONデータをエンコードして標準出力へ出力 json_dump_file(root, "/dev/stdout", JSON_INDENT(2)); // JSONメモリー解放 json_decref(root); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[ { "精度": "zip", "緯度": 37.7668, "経度": -122.3959, "住所": "", "都市": "SAN FRANCISCO", "州": "CA", "郵便番号": "94107", "国": "US" }, { "精度": "zip", "緯度": 37.371991, "経度": -122.026020, "住所": "", "都市": "SUNNYVALE", "州": "CA", "郵便番号": "94085", "国": "US" } ] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <jansson.h> int main(int argc, char *argv[]) { // JSONデータを生成 json_t *root = json_pack( "[{sssfsfssssssssss}" "{sssfsfssssssssss}]", "精度", "zip", "緯度", 37.7668, "経度", -122.3959, "住所", "", "都市", "SAN FRANCISCO", "州", "CA", "郵便番号", "94107", "国", "US", "精度", "zip", "緯度", 37.371991, "経度", -122.026020, "住所", "", "都市", "SUNNYVALE", "州", "CA", "郵便番号", "94085", "国", "US" ); // JSONデータをエンコードして標準出力へ出力 json_dump_file(root, "/dev/stdout", JSON_INDENT(2)| JSON_REAL_PRECISION(10)); // JSONメモリー解放 json_decref(root); return 0; } |
1 2 3 4 5 6 7 |
zip 37.7668 -122.3959 _ SAN_FRANCISCO CA 94107 US zip 37.371991 -122.02602 _ SUNNYVALE CA 94085 US zip 32.8209296 -97.0117199 _ DALLAS TX 75001 US zip 32.8010236 -97.4294011 _ FORT_WORTH TX 76006 US zip 47.6131229 -122.4121037 _ SEATTLE WA 98101 US zip 41.3141183 -88.2727778 _ CHICAGO IL 60007 US zip 40.6976701 -74.259856 _ NEW_YORK NY 10001 US |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <sysexits.h> #include <jansson.h> #define ITEM_MAX_LEN 100 // 地図データ構造体 struct map_info { char precise[ITEM_MAX_LEN]; double latitude; double longitude; char address[ITEM_MAX_LEN]; char city[ITEM_MAX_LEN]; char state[ITEM_MAX_LEN]; char zip[ITEM_MAX_LEN]; char country[ITEM_MAX_LEN]; }; int main(int argc, char *argv[]) { FILE *fp; struct map_info map; json_t *root; // データファイルオープン fp = fopen(argv[1], "r"); if (NULL == fp) return EX_NOINPUT; // データを8項目ごとに読み取って順次処理 while (EOF != fscanf(fp, "%s %lf %lf %s %s %s %s %s", map.precise, &map.latitude, &map.longitude, map.address, map.city, map.state, map.zip, map.country)) { // JSONデータを生成 root = json_pack( "{sssfsfssssssssss}", "精度", map.precise, "緯度", map.latitude, "経度", map.longitude, "住所", map.address, "都市", map.city, "州", map.state, "郵便番号", map.zip, "国", map.country ); // JSONデータをエンコードして標準出力へ json_dump_file(root, "/dev/stdout", JSON_INDENT(2)| JSON_REAL_PRECISION(7)); putchar('\n'); // JSONメモリー解放 json_decref(root); } // データファイルクローズ fclose(fp); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CMD= make_json1 make_json2 \ make_json3 make_json4 \ make_json5 CC= cc RM= rm -f CFLAGS+= -I/usr/local/include \ -L/usr/local/lib \ -ljansson build: ${CMD} .for i in ${CMD} ${i}: ${CC} -o ${i} ${i}.c ${CFLAGS} .endfor clean: ${RM} ${CMD} |