Sample code for 30+ languages & platforms
Unicode C

QuickBooks - Parse the JSON of a Customer Balance Detail Report

See more CSV Examples

This example is to show how to parse the JSON of a particular Quickbooks report. The techniques shown here may help in parsing similar reports.

The JSON to be parsed is available at Sample Quickbooks Customer Balance Detail Report JSON

Chilkat Unicode C Downloads

Unicode C
#include <C_CkHttpW.h>
#include <C_CkJsonObjectW.h>
#include <C_CkCsvW.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkHttpW http;
    const wchar_t *jsonStr;
    HCkJsonObjectW json;
    HCkCsvW csv;
    int numColumns;
    int i;
    int row;
    int numRows;
    int col;

    success = FALSE;

    // This example assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    http = CkHttpW_Create();

    // Get the JSON we'll be parsing..
    jsonStr = CkHttpW_quickGetStr(http,L"https://www.chilkatsoft.com/exampleData/qb_customer_balance_detail_report_2.json");
    if (CkHttpW_getLastMethodSuccess(http) != TRUE) {
        wprintf(L"%s\n",CkHttpW_lastErrorText(http));
        CkHttpW_Dispose(http);
        return;
    }

    json = CkJsonObjectW_Create();
    CkJsonObjectW_Load(json,jsonStr);

    // As an alternative to manually writing code, use this online tool to generate parsing code from sample JSON: 
    // Generate Parsing Code from JSON

    // Let's parse the JSON into a CSV, and then save to a CSV file.
    csv = CkCsvW_Create();
    CkCsvW_putHasColumnNames(csv,TRUE);

    // Set the column names of the CSV.
    numColumns = CkJsonObjectW_SizeOfArray(json,L"Columns.Column");
    if (numColumns < 0) {
        wprintf(L"Unable to get column names\n");
        CkHttpW_Dispose(http);
        CkJsonObjectW_Dispose(json);
        CkCsvW_Dispose(csv);
        return;
    }

    i = 0;
    while (i < numColumns) {
        CkJsonObjectW_putI(json,i);
        CkCsvW_SetColumnName(csv,i,CkJsonObjectW_stringOf(json,L"Columns.Column[i].ColTitle"));
        i = i + 1;
    }

    // Let's get the rows.
    // We'll ignore the Header and Summary, and just get the data.
    row = 0;
    numRows = CkJsonObjectW_SizeOfArray(json,L"Rows.Row[0].Rows.Row");
    if (numRows < 0) {
        wprintf(L"Unable to get data rows\n");
        CkHttpW_Dispose(http);
        CkJsonObjectW_Dispose(json);
        CkCsvW_Dispose(csv);
        return;
    }

    while (row < numRows) {
        CkJsonObjectW_putI(json,row);
        numColumns = CkJsonObjectW_SizeOfArray(json,L"Rows.Row[0].Rows.Row[i].ColData");
        col = 0;
        while (col < numColumns) {
            CkJsonObjectW_putJ(json,col);
            CkCsvW_SetCell(csv,row,col,CkJsonObjectW_stringOf(json,L"Rows.Row[0].Rows.Row[i].ColData[j].value"));
            col = col + 1;
        }

        row = row + 1;
    }

    // Show the CSV 
    wprintf(L"%s\n",CkCsvW_saveToString(csv));

    // Save to a CSV file
    success = CkCsvW_SaveFile(csv,L"qa_output/customerDetailReport.csv");


    CkHttpW_Dispose(http);
    CkJsonObjectW_Dispose(json);
    CkCsvW_Dispose(csv);

    }