janssonを使ってみた。
JSONの処理は、picojsonを使っていましたが、いろいろ悩むことがあり、janssonに変更中です。
janssonは、APIのドキュメントがあるのが良いです。
■ヘッダ
#include <jansson.h>
■ライブラリ
jansson.lib
■ファイルを開く
json_t *result = json_load_file("json.db", 0, &error);
if (result == NULL) {
fputs(error.text, stderr);
return 0;
}
■オブジェクトを開く
json_t *JO1 = json_object_get(result, "roots");
if (JO1 == NULL) {
printf("JO1 is NULL\n");
return 0;
}
■オブジェクトの確認
//オブジェクトの判定test
if (json_is_null(JO2) == 1){
printf("NULL\n");
}
if (json_is_object(JO2) == 1){
printf("object\n");
}
if (json_is_integer(JO2) == 1){
printf("integer\n");
}
if (json_is_array(JO2) == 1){
printf("array\n");
}
if (json_is_string(JO2) == 1){
printf("string\n");
}
■Arrayの値の読み出し
json_t *JO3;
JO3 = json_object_get(JO2, "children");
if (JO3 == NULL) {
printf("JO3 is NULL\n");
return 0;;
}
json_t *JO4;
json_array_foreach(JO3, i, JO4) {
printf("%s/%s: %s\n",
json_string_value(json_object_get(JO4, "name")),
json_string_value(json_object_get(JO4, "url")));
}
■オブジェクトの一覧をループ
keyに名前が入り、valueが新しいオブジェクト
json_t *value;
const char *key;
json_object_foreach(JObj,key,value){
printf("key:%s\n",key);
}
picojsonのMEMO
JSONのデータを扱うことがあり、調べました。
JSONについては、ここに書いています。
http://www.json.org/json-ja.html
C++に処理するにあたり、ヘッダファイルだけで扱えるとのことで、調べてみました。
ライブラリは動作させるまでが大変だっりします。
ここから、picojson.hをダウンロードします。
https://github.com/kazuho/picojson
このようなツールが作れることに尊敬します。
■使い方
色々なサイトを参考にさせてもらいました。
// 変数
stringstream ss;
ifstream f;
unsigned int i;
// Jsonファイルの読み込み
f.open("Books", ios::binary);
if (!f.is_open()){
return 1;
}
ss << f.rdbuf();
f.close();
// Parse Json data
value v;
ss >> v;
string err = get_last_error();
if(!err.empty()) {
cerr << err << endl;
return -1;
}
■オブジェクトの読み込み
object &o = v.get<object>();
rootsを読む例
object o = v.get<object>()["roots"].get<object>();
■オブジェクトの抽出
object o = v.get<object>()["roots"].get<object>();
for (object::const_iterator it = o.begin(); it != o.end(); it++) {
char buf[4096];
sprintf_s(buf, "%s", it->first.c_str());
MessageBoxA(NULL,buf,"first",MB_OK);
}
it-firstは文字列
it-secondは値
文字列への変換には、to_str()を使用
c_str()で、stringをcharにします。
it-second.to_str().c_str()
■Arrayの読み込み
barの下にchildがある例
object& o2 = o["bar"].get<object>();
array& aAry = o2["child"].get<array>();
for (i = 0; i < aAry.size(); i++){
object& o3 = aAry[i].get<object>();
strcpy(buf,(char *)o3["name"].get<string>().c_str());
}
■型の確認例
型の確認は、getの代わりにisを使います。
//バッファの型を確認
if (o[buf].is<string>() == TRUE){
}else if (o[buf].is<array>() == TRUE){
}else if (o[buf].is<object>() == TRUE){
まだ、勉強中なのでここまでです。
C++でHPDF PNG画像
HPDFでの画像関係のメモです。
HPDF_Doc pdf;
HPDF_Page page = HPDF_GetCurrentPage (pdf);
//PDFやpageは、なんやかんやする。
HPDF_Image image;
//png画像のをimageに読み込む、filenameは、ファイル名
image = HPDF_LoadPngImageFromFile (pdf, filename);
//横幅を取得
int GetWSize = HPDF_Image_GetWidth(image);
//縦幅を取得
int GetHSize = HPDF_Image_GetHeight(image);
//PDFに画像を書き込み
HPDF_Page_DrawImage (page, image, x, y,横幅,縦幅);
Rubyでレジストリファイルを確認
Rubyで、ロードしていないWindowsのレジストリファイルを確認するソースです。これなら、Linuxからでも動作できます。
入手先
Volatile Minds: Reading offline registry hives in pure ruby
RubyでExcel操作 少しまとめ
また、調べることがあります。
# -*- Encoding:UTF-8 -*-
require 'win32ole'
class Excel
end
excel = WIN32OLE.new('Excel.Application')
WIN32OLE.const_load(excel, Excel)
#Excelファイルをダイアログで開く場合
#book_file = excel.GetOpenFilename
#book = excel.WorkBooks.Open(book_file)
#ファイル名指定で開く場合1(COM使用)
#fso = WIN32OLE.new('Scripting.FileSystemObject')
#filename = fso.GetAbsolutePathName("test.xlsx")
#book = excel.WorkBooks.Open(filename)
#ファイル名指定で開く場合2
#book = excel.workbooks.open 'sample.xlsx'
# 新規ブックを作成
book = excel.workbooks.add
#画面に状況を表示させる。
excel.visible = true
#シートにワークシートの1を指定
sheet = book.Worksheets(1)
#セルの値を取得(縦、横)
#s = sheet.Cells.Item(3,3).value
#セルに値を格納(縦、横)
sheet.Cells.Item(3,3).value = 1000
sheet.Cells.Item(2,2).value = "画像一覧"
#test
sheet.Cells.Item(2,2).Font.Size = 20
sheet.Cells.Font.Name = 'MS ゴシック'.tosjis
#sheet.Cells.Item(2, 2).Font.Bold = true #失敗
#スタイル
#折り返して表示
#列の幅
#罫線
range = sheet.range("F11:G16")
#色
#range.Interior.ColorIndex = 6
#range.Interior.Pattern = Excel::XlSolid
#罫線
#線の種類
range.borders.lineStyle = Excel::XlContinuous
#線の太さ
range.borders.weight = Excel::XlThin
#名前を付けて保存する
#book.saveAs 'e:\test.xlsx'
#Excelブックを閉じる
#true:上書き false:上書きしない
#book.close(true)
#Excel終了
#excel.quit