C++ Builder XE4 > JSON > TStringGrid의 JSON 파일 저장 > TJSONArray 사용

17422 단어 JSONfileIOcppBuilder
운영 환경
C++ Builder XE4
秀丸エディタ Version 8.79

처리 개요


  • TStringGrid에 항목과 값이 들어 있음
  • 항목은 옆에 늘어서 있습니다
  • 여러 데이터가 세로로 정렬

  • JSON 파일에 저장

  • 참고



  • JSON with RadStudio Delphi or C++ Builder by CRAIG CHAPMAN

  • C++ Builder 구현을 참고했습니다.

    데이터


    #include 에서 .csv 정의한 파일을 사용합니다.
  • Link > Wandbox : 파일을 읽을 수 있습니다 | C 언어 : include에서 csv 파일을 배열로 읽습니다.
  • comment by @tenmyo 님
  • c++ builder XE4, 10.2 Tokyo > .csv에서 리스트를 static const String[]에 읽어들여 / "//"로 코멘트 아웃도 할 수 있다

  • 예:

    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 관련

    좋은 웹페이지 즐겨찾기