C++ Builder XE4 > JSON > TStringGrid의 JSON 파일 저장 > TJSONArray 사용
17422 단어 JSONfileIOcppBuilder
C++ Builder XE4
秀丸エディタ Version 8.79
처리 개요
참고
JSON with RadStudio Delphi or C++ Builder by CRAIG CHAPMAN
C++ Builder 구현을 참고했습니다.
데이터
#include
에서 .csv 정의한 파일을 사용합니다.예:
data180419.csv
"name", "age", "type",
"7of9", "120", "borg",
"Janeway", "40", "human",
"Odo", "250", "shapeShifter",
위의 파일은 "프로젝트 파일(.cbproj)"이 있는 파일에 준비합니다.
코드 v0.1
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TStringGrid *StringGrid1;
TButton *B_toJSON;
void __fastcall B_toJSONClick(TObject *Sender);
private: // ユーザー宣言
void __fastcall makeTestData(void);
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <DBXJSON.hpp> // for JSON
#include <memory> // for unique_ptr
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
/*
v0.1 Apr. 19, 2018
- add B_toJSONClick()
+ JSONArrayでファイル書込み
- add [kGroupName]
- add [kSaveFile]
- add makeTestData()
- add kTitileAndData[][]
- add [NUM_ITEM]
*/
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
makeTestData();
}
//---------------------------------------------------------------------------
// StringGridへのテストデータ作成
//
#define NUM_ITEM (3) // 項目数 (例: 3 for "name, age, type")
// StringGrid用データ
static const String kTitileAndData[][NUM_ITEM] =
{
#include "data180419.csv"
};
void __fastcall TForm1::makeTestData(void)
{
StringGrid1->FixedRows = 1; // タイトルは1行
StringGrid1->FixedCols = 0; // 固定列はなし
StringGrid1->ColCount = NUM_ITEM;
int rowCnt = sizeof(kTitileAndData) / sizeof(kTitileAndData[0]);
for(int ri=0; ri < rowCnt; ri++) { // ri: row index
for(int ci=0; ci < NUM_ITEM; ci++) { // ci: column index
StringGrid1->Cells[ci][ri] = kTitileAndData[ri][ci];
}
}
}
//---------------------------------------------------------------------------
// JSON処理
static const String kSaveFile = L"out180419.JSON"; // 出力ファイル
static const String kGroupName = L"member"; // TJSONArrayを格納するグループ名
void __fastcall TForm1::B_toJSONClick(TObject *Sender)
{
// 1. JSON用意
TJSONObject *json = new TJSONObject(); // ファイル保存用JSON
TJSONArray *jary = new TJSONArray(); // グループ用JSONArray
json->AddPair(kGroupName, jary);
TJSONObject *member; // グループ内のメンバー用JSON
for(int ri=1; ri < StringGrid1->RowCount; ri++) { // ri: row index
member = new TJSONObject();
for(int ci=0; ci < NUM_ITEM; ci++) { // ci: column index
String key = StringGrid1->Cells[ci][0]; // 0: 1行目(title)を取る
String value = StringGrid1->Cells[ci][ri];
if (value.Length() == 0) { // 空データ
break;
}
member->AddPair(key, value);
}
if (member->Size() > 0) {
jary->AddElement(member);
}
}
// 2. ファイル保存
std::unique_ptr<TStringList> sl(new TStringList);
sl->Add( json->ToString() );
sl->SaveToFile(kSaveFile);
// 3. 手仕舞い
//member->Free(); // Error: 無効なポインタ操作
//jary->Free(); // Error: 無効なポインタ操作
json->Free();
ShowMessage(L"Saved to [" + kSaveFile + L"]");
}
//---------------------------------------------------------------------------
실행 예
결과 파일:
out180419.JSON
{"member":[{"name":"7of9","age":"120","type":"borg"},{"name":"Janeway","age":"40","type":"human"},{"name":"Odo","age":"250","type":"shapeShifter"}]}
아래는 JSON Pretty Linter Ver3에서 성형 후
관련 : onlineTool > JSON > JSON 성형 > JSON-Viewer (JSON Pretty Linter Ver3)
{
"member": [
{
"name": "7of9",
"age": "120",
"type": "borg"
},
{
"name": "Janeway",
"age": "40",
"type": "human"
},
{
"name": "Odo",
"age": "250",
"type": "shapeShifter"
}
]
}
걸려
member와 jary의 Free()로 「무효인 포인터 조작」이 된다.
링크
C++ Builder + JSON 관련
Reference
이 문제에 관하여(C++ Builder XE4 > JSON > TStringGrid의 JSON 파일 저장 > TJSONArray 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/abeefdb8d00a04edd4ff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)