A JSON file stores data objects in JavaScript Object Notation(JSON) format. It’s lightweight and readable, the developer uses it to transmit simple data.
The article shows how to create and read the JSON file in the Qt environment. I planed to save two books’ information to a simple JSON file in the following example.

Write Data To JSON File

1. Create a single book QJsonObject object

Create a QJsonObject object which contains key-value pairs, it can be used to store name and price information of books.
Add struct Book in the program to help to write C++ code.

struct Book
{
    string name;
    double price;
    Book( string _name, double _price )
    {
        name = _name;
        price = _price;
    }
};

//...

    Book obj1( "high school mathematics", 12 );
    QJsonObject book1;
    book1.insert( "name", obj1.name.c_str() );
    book1.insert( "price", obj1.price );

    Book obj2( "advanced high school mathematics", 14 );
    QJsonObject book2;
    book2.insert( "name", obj2.name.c_str() );
    book2.insert( "price", obj2.price );

2. Collect Single Books To Form The Main QJsonObject

Put all single QJsonObject objects to an independent one.

    QJsonObject content;
    content.insert( "book1", book1 );
    content.insert( "book2", book2 );

3. Write To Local JSON File

Use QJsonDocument to convert the main QJsonObject object to text stream.

    QJsonDocument document;
    document.setObject( content );
    QByteArray bytes = document.toJson( QJsonDocument::Indented );
    QFile file( path );
    if( file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
    {
        QTextStream iStream( &file );
        iStream.setCodec( "utf-8" );
        iStream << bytes;
        file.close();
    }
    else
    {
        cout << "file open failed: " << path.toStdString() << endl;
    }

Read JSON File

1. Open File And Read Data

The QJsonDocument and QFile and help us to open the JSON file and store data to the JSON object.

    if( file.open( QIODevice::ReadOnly ) )
    {
        QByteArray bytes = file.readAll();
        file.close();

        QJsonParseError jsonError;
        QJsonDocument document = QJsonDocument::fromJson( bytes, &jsonError );
        if( jsonError.error != QJsonParseError::NoError )
        {
            cout << "fromJson failed: " << jsonError.errorString().toStdString() << endl;
            return ;
        }
        if( document.isObject() )
        {
            QJsonObject jsonObj = document.object();
        //...
     }

2. Analyze The Main JSON Object

Judge whether the father Json Object contains the target key, take the relevant value, and convert to the JSON object if it exists.
Then read all key-value pairs in the child JSON object.

            QJsonObject jsonObj = document.object();
            QStringList books;
            books << "book1" << "book2";
            for( auto book: books )
            {
                if( jsonObj.contains( book ) )
                {
                    QJsonObject obj = jsonObj.value( book ).toObject();
                    QStringList keys = obj.keys();
                    for( auto key: keys )
                    {
                        auto value = obj.take( key );
                        if( value.isDouble() )
                        {
                            qDebug() << key << " : " << value.toDouble();
                        }
                        else if( value.isString() )
                        {
                            qDebug() << key << " : " << value.toString();
                        }

                    }
                }
            }

All Test Code

Here is the complete source code for all the above steps.

#include <QtXml>
#include <QtCore>
#include <iostream>
#include <QIODevice>

using namespace std;

struct Book
{
    string name;
    double price;
    Book( string _name, double _price )
    {
        name = _name;
        price = _price;
    }
};

void CreateJson(const QString &path)
{
    Book obj1( "high school mathematics", 12 );
    QJsonObject book1;
    book1.insert( "name", obj1.name.c_str() );
    book1.insert( "price", obj1.price );

    Book obj2( "advanced high school mathematics", 14 );
    QJsonObject book2;
    book2.insert( "name", obj2.name.c_str() );
    book2.insert( "price", obj2.price );

    QJsonObject content;
    content.insert( "book1", book1 );
    content.insert( "book2", book2 );

    QJsonDocument document;
    document.setObject( content );
    QByteArray bytes = document.toJson( QJsonDocument::Indented );
    QFile file( path );
    if( file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
    {
        QTextStream iStream( &file );
        iStream.setCodec( "utf-8" );
        iStream << bytes;
        file.close();
    }
    else
    {
        cout << "file open failed: " << path.toStdString() << endl;
    }
}

void ReadJson(const QString &path)
{
    QFile file( path );
    if( file.open( QIODevice::ReadOnly ) )
    {
        QByteArray bytes = file.readAll();
        file.close();

        QJsonParseError jsonError;
        QJsonDocument document = QJsonDocument::fromJson( bytes, &jsonError );
        if( jsonError.error != QJsonParseError::NoError )
        {
            cout << "fromJson failed: " << jsonError.errorString().toStdString() << endl;
            return ;
        }
        if( document.isObject() )
        {
            QJsonObject jsonObj = document.object();
            QStringList books;
            books << "book1" << "book2";
            for( auto book: books )
            {
                if( jsonObj.contains( book ) )
                {
                    QJsonObject obj = jsonObj.value( book ).toObject();
                    QStringList keys = obj.keys();
                    for( auto key: keys )
                    {
                        auto value = obj.take( key );
                        if( value.isDouble() )
                        {
                            qDebug() << key << " : " << value.toDouble();
                        }
                        else if( value.isString() )
                        {
                            qDebug() << key << " : " << value.toString();
                        }

                    }
                }
            }
        }
    }
}

int main(int argc,char **argv)
{
    QString path = "/Users/weiyang/Desktop/test.json";
    CreateJson( path );
    ReadJson( path );
    return 0;
}

Output:

"name"  :  "high school mathematics"
"price"  :  12
"name"  :  "advanced high school mathematics"
"price"  :  14

0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

You cannot copy content of this page