Coder Social home page Coder Social logo

qt-json's Introduction

The qt-json project is a simple collection of functions for parsing and serializing JSON data to and from QVariant hierarchies.

NOTE: Qt5 introduced a native JSON object class. If you are targeting Qt5, you should use that instead.

HOW TO USE

Parsing JSON

The parser is really easy to use. Let's say we have the following QString of JSON data:

{
  "encoding" : "UTF-8",
  "plug-ins" : [
    "python",
    "c++",
    "ruby"
  ],
  "indent" : {
    "length" : 3,
    "use_space" : true
  }
}

We would first call the parse-function:

#include "json.h"

bool ok;
// json is a QString containing the JSON data
QtJson::JsonObject result = QtJson::parse(json, ok).toMap();

if(!ok) {
  qFatal("An error occurred during parsing");

Assuming the parser completed without errors, we can then go through the hierarchy:

qDebug() << "encoding:" << result["encoding"].toString();
qDebug() << "plugins:";

foreach(QVariant plugin, result["plug-ins"].toList()) {
    qDebug() << "  -" << plugin.toString();
}

QtJson::JsonObject nested = result["indent"].toMap();
qDebug() << "length:" << nested["length"].toInt();
qDebug() << "use_space:" << nested["use_space"].toBool();

The previous code would print out the following:

encoding: "UTF-8"
plugins:
  - "python"
  - "c++"
  - "ruby"
length: 3
use_space: true

Serializing JSON

To write JSON data from Qt object is as simple as creating and assigning data to a QVariantMap/JsonObject:

QtJson::JsonObject contributor;
contributor["name"] = "Luis Gustavo";
contributor["age"] = 22;

QByteArray data = QtJson::serialize(contributor);

The byte array 'data' contains valid JSON data:

{
  "name": "Luis Gustavo",
  "age": 22
}

Serializing JSON pretty-print

By default, the serialization will create a minified version, like following:

{"name":"Luis Gustavo","age":22}

If you are debugging or logging, you may prefer to enable pretty-print mode globally, before serialize:

QtJson::setPrettySerialize(true);

QByteArray data = QtJson::serialize(contributor);
// ...
QByteArray data = QtJson::serialize(other_contributor);

Obviously, you can disable it with:

QtJson::setPrettySerialize(false);

After creating the QVariantMap, you can create a QVariantList/JsonArray and append the QVariantMaps.

QtJson::JsonObject friend1, friend2, friend3;
friend1["id"] = 1;
friend1["name"] = "Mackenzie Hamphrey";

friend2["id"] = 2;
friend2["name"] = "Melanie Molligan";

friend3["id"] = 3;
friend3["name"] = "Sydney Calhoun";

QtJson::JsonArray friends;
friends.append(friend1);
friends.append(friend2);
friends.append(friend3);

QtJson::JsonObject obj;
obj["friends"] = friends;

This way you create a nested structure:

{
    "friends": [
        {
            "id": 1,
            "name": "MackenzieHamphrey"
        },
        {
            "id": 2,
            "name": "MelanieMolligan"
        },
        {
            "id": 3,
            "name": "SydneyCalhoun"
        }
    ]
}

If you continue this process recursively, you nest more levels into the JSON structure.

Using Builders

For simplicity you can use builders, if you prefer.

For example, create a JsonObject:

QtJson::JsonObject json = QtJson::objectBuilder()
    ->set("field_1", 10)
    ->set("field_2", "A string")
    ->set("field_3", true)
    ->set("field_4", QtJson::objectBuilder()
        ->set("sub_field_1", 10.4)
        ->set("sub_field_n", "Another string")
    )
    ->create();

Or create a JsonArray:

QtJson::JsonArray json = QtJson::arrayBuilder()
    ->add(5)
    ->add(90.2)
    ->add(true)
    ->add("anything else")
    ->create();

Take a look at this example that rewrite the previous one:

QtJson::JsonObject obj = QtJson::objectBuilder()
    ->set("friends", QtJson::arrayBuilder()
        ->add(QtJson::objectBuilder()
            ->set("id", 1)
            ->set("name", "Mackenzie Hamphrey")
        )
        ->add(QtJson::objectBuilder()
            ->set("id", 2)
            ->set("name", "Melanie Molligan")
        )
        ->add(QtJson::objectBuilder()
            ->set("id", 3)
            ->set("name", "Sydney Calhoun")
        )
    )
    ->create();

3. CONTRIBUTING

Send in a pull request and bug the maintainer until it gets merged and published. Make sure to add yourself to AUTHORS.

qt-json's People

Contributors

alekseydurachenko avatar cydside avatar gaudecker avatar george-hopkins avatar gitantonio avatar gustavosbarreto avatar joum avatar klnusbaum avatar martinrotter avatar me21 avatar milabs avatar naihil avatar s-k avatar sunxiaoguang avatar vojtechkral avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

qt-json's Issues

Unicode string problem

Hi,

I moved from Qt 5.0.2 to Q t4.8.4. On Qt5 I used json parser provided by Qt. On Qt 4.8.4 I needed find own. I like your simple json package. It work fine except unicode strings. I send json via websocket client. I also writting sent json into file. When sending string with special polish characters (like "ść") I see in log file "msg" : "Ã�Â�Ã�Â�" server returns me "msg" : "Ã�Â�Ã�Â�Ã�Â�Ã�Â�Ã�Â�Ã�Â�Ã�Â�Ã�Â�". On QT5 everything worked fine. Need I some extra code to handle unicode? I construct json like this:

o["msg"] = ui->editMsg->text().toUtf8();
send(QString(QtJson::serialize(o)));

And "send" function is:

void send(const QString &msg)
{
  logg.send("Sent", msg);
  ws->sendUtf8Message(msg.toUtf8());
}

Regards

Wrong conversion to double!

I tested and found that the use of:

str = QByteArray::number(value, 'g', 20); //line 123 json.cpp

is a really problem (eg: 41.32 converted in "41.320000000000000284" !!!!!!!)

it seems depend on the precision you used (20).
Partially(not completely tested) solved in the following way:

str = QByteArray::number(value, 'g'); //line 123 json.cpp

Thanks for your nice job.

Empty string parses as null string

{
    "action":"EntityHandler",
    "method":"updateParameter",
    "data": [
        "/path/name",
        "text",
        ""
    ],
    "type":"rpc",
    "tid":294
}

When parsed, "" becomes a null QString, as opposed to an empty QString. The difference is significant. This seems to be an issue in Json::parseString, where the initial result string is created as QString s, rather than QString s("") or QString s = "".

Small mistake in example

The line:
QVariantMap result = Json::parse(json, ok).toMap();
should be:
QVariantMap result = parse(json, ok).toMap();

Why class?

Why is QtJson API encapsulated in a class? As far as I know, there are no non-static field in the class, the class has no state, therefore, I'd say it's useless.

Also, it exposes the private function in .h.

Why not just leave the public function in QtJson namespace without a class and those private functions as static in the .cpp

To explain what I mean I'll try attach code/commit...

Looking for a maintainer

I am not the right person to maintain qt-json anymore, actually I haven't been for a long time. I have professionally moved away from the Qt ecosystem and lack the time and passion that I once had for this.

So any person willing to dedicate a little time for this project please step forward.

I will be moving this repository under the new qt-json organization.

Occasionally needed: json parse w/ an ordered QVariantMap, e.g. Prefs dialog setup

This can be accomplished by subclassing QVariantMap:

#ifndef ORDEREDVARIANTMAP_H
#define ORDEREDVARIANTMAP_H

#include <QtCore>

class OrderedVariantMap : public QMap<QString, QVariant> {
// Test:
//    OrderedVariantMap test_map;
//    test_map.insert("xxx", 1);
//    test_map.insert("aaa", 2);
//    test_map.insert("kkk", 3);

//    test_map["321"] = 4;
//    test_map["000"] = 5;
//    test_map["123"] = 6;

//    qDebug() << "QMap.keys()" << test_map.keys();
//    qDebug() << "QMap.orderedKeys()" << test_map.orderedKeys();

//    QVariant test_variant;
//    test_variant.setValue(test_map);
//    qDebug() << "test_variant.typeName()" << test_variant.typeName();
//    OrderedVariantMap test_map_recovered = qvariant_cast<OrderedVariantMap>(test_variant);
//    qDebug() << "test_map_recovered.orderedKeys()" << test_map_recovered.orderedKeys();

// Test results:
//    QMap.keys() ("000", "123", "321", "aaa", "kkk", "xxx")
//    QMap.orderedKeys() ("xxx", "aaa", "kkk", "321", "000", "123")
//    test_variant.typeName() OrderedVariantMap
//    test_map_recovered.orderedKeys() ("xxx", "aaa", "kkk", "321", "000", "123")

public:
    OrderedVariantMap ( );
    ~OrderedVariantMap ( );

    void
    clear ( );

    void // QMap::iterator
    insert ( const QString &key,
             const QVariant &value );

    QVariant&
    operator[] ( const QString &key );

    const QVariant
    operator[] ( const QString &key ) const;

    const QString
    orderedKey ( int index ) const;

    const QVariant
    orderedValue ( int index ) const;

    QStringList
    orderedKeys ( ) const ;

private:
    QStringList Ordered_Keys;

protected:

};

Q_DECLARE_METATYPE(OrderedVariantMap)

#endif // ORDEREDVARIANTMAP_H

and

#include "OrderedVariantMap.h"

OrderedVariantMap::OrderedVariantMap ( ) : QMap ( ) {

}

OrderedVariantMap::~OrderedVariantMap ( ) {

}

QStringList
OrderedVariantMap::orderedKeys ( ) const {
    return Ordered_Keys;
}

void
OrderedVariantMap::clear ( ) {
    Ordered_Keys.clear();
    QMap::clear();
}

void // QMap::iterator
OrderedVariantMap::insert ( const QString &key,
                            const QVariant &value ) {
    Ordered_Keys.append(key);
    QMap::insert(key, value);
}

QVariant&
OrderedVariantMap::operator[] ( const QString &key ) {
    Ordered_Keys.append(key);
    return QMap::operator [](key);
}

const QVariant
OrderedVariantMap::operator[] ( const QString &key ) const {
    return this->value(key);
}

const QString
OrderedVariantMap::orderedKey ( int index ) const {
    return Ordered_Keys[index];
}

const QVariant
OrderedVariantMap::orderedValue ( int index ) const {
    return this->value(Ordered_Keys[index]);
}

I've made the changes to json.h/.cpp which I'll send if you're interested.

Ken

kcrossen at mail server gmail.com

Too many QString constructions/destructions around

Hi there,
profiler suggests (and it is right this time) that below mentioned methods create myriads of QString temporary instances that can be easily avoided as written below - using static QString instance for the very static contents.

diff -r 181aa426115e qtjson/json.cpp
--- a/qtjson/json.cpp Wed Nov 21 10:04:39 2012 +0100
+++ b/qtjson/json.cpp Wed Nov 21 14:13:44 2012 +0100
@@ -503,11 +503,12 @@
*/
int Json::lastIndexOfNumber(const QString &json, int index)
{

  • static const QString numericCharacters("0123456789+-.eE");
    int lastIndex;
 for(lastIndex = index; lastIndex < json.size(); lastIndex++)
 {
  •            if(QString("0123456789+-.eE").indexOf(json[lastIndex]) == -1)
    
  •            if(numericCharacters.indexOf(json[lastIndex]) == -1)
             {
                     break;
             }
    
    @@ -521,9 +522,11 @@
    */
    void Json::eatWhitespace(const QString &json, int &index)
    {
  • static const QString whitespaceChars(" \t\n\r");
  • for(; index < json.size(); index++)
    {
  •            if(QString(" \t\n\r").indexOf(json[index]) == -1)
    
  •            if(whitespaceChars.indexOf(json[index]) == -1)
             {
                     break;
             }
    

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.