JSONのC/C++での運用及びQt解析Json例

5445 ワード

最近QTで小さなソフト(Release、ははは)を書いていますが、途中でJSONの問題を解析したり、でこぼこの道に出会ったりして、いくつかの経験をまとめて、ぜひ皆さんと分かち合いましょう.まず簡単にJSONについて話します.
JSON(JavaScript Object Notation)は、軽量レベルのデータ交換フォーマットです.読みやすく、書きやすい.同時に機械の解析と生成も容易である.JavaScript Programming Language、Standard ECMA-2623 rd Edition–December 1999のサブセットに基づいています.JSONは完全に言語から独立したテキスト形式を採用しているが、C言語の家族のような習慣(C,C++,C#,Java,JavaScript,Perl,Pythonなどを含む)も使用されている.これらの特性によりJSONは理想的なデータ交換言語となっている.
ところでJSONはWeb上での応用が非常によく、XMLは考えがいいが、冗長で解析が面倒だ.JSONはJavascriptの文字記述言語として、手動で解析することなくJavascriptに直接渡すことで、Evalは結果を得ることができます.PHP 5.2以上には、JSONの解析関数が内蔵されており、1つの関数がPHPのオブジェクトをJSONに変換し、XMLよりもずっと速く、便利である(PHPドライオブジェクトのSerializeとUnserializeが強みである).
今日はCとC++でJSONを読み取る方法についてお話しします.実際にJSONに書き込むのは比較的簡単で、難点は読み取りです.また、QTを例にとると、このように簡単に述べることができ、STLやBoostは私が真剣に接触したことがなく、書くのが不便です.
ライブラリの選択
今JSON解析ライブラリは空いっぱいで、ビジネスプログラムでない限り、自分で書く必要はありません.JsonCPP、QJson、Json-Spirit、jaulaなどC++のライブラリを試したことがあります.全体的な問題に直面して、中国語(UTF-8コードもだめ)、Windowsでのコンパイルが不便で、体積が肥大化しているなどの欠点があり、最終的な選択はCライブラリjson-cである.GoogleはJSONの各Cライブラリの長所を比較した文章を見て、Json-C互換性が最もよく、中国語(UTF-8を使用)をサポートしていると言ったからだ.
コンパイルしよう
コンパイルは依然として不便で、configureとGCCを使用する必要があります.これでMSYSかCygwinが必要になりますが、Windowsの皆さんが大いにコンパイルする必要がある場合は、Bashを使用するためにGoogleに最も基本的なMSYSかCygwinをインストールしてください.また、MinGWも欠かせません.GCCとMakeを使うからです.
Linuxの下
$ ./configure
$ make && make install

Windowsの下
$ ./configure --prefix=/cygdrive/d/json-c/
$ mingw32-make && mingw32-make install

Windowsの下でCygwinを使い、ライブラリをDディスクのJson-cディレクトリにインストールすることを指定し、指定しないとCygwinの/usr/localの下にインストールされ、使いにくいです.
この方面はもう多く言わないで、ここで皆さんがこれらの概念を知っていると仮定します.
使用
C++の下でCのライブラリを使用する場合、ヘッダファイルは特殊な処理が必要です.CコンパイラとC++コンパイラがコンパイルした中間コードの記号が一致しないため、処理しなければ、最後にリンクするときに記号が見つからないという問題が発生します.以下はC++のコードです.
#include 
#include 
#include 
 
extern "C"{
#include 
#include 
#include 
#include 
#include 
}
 
.....
//           ,          
 
// 1)     
char * json_string = " [ 10, 20, \"nice\" ] ";
struct json_object *obj, *temp_obj;
QList< QVariant > data;
 
obj = json_tokener_parse( json_string ); /*    Obj   Array */
for(int i=0 ; i data;
 
obj = json_tokener_parse( json_string );
json_object_object_foreach( obj, key, value ){ //    key Value       。           -_-|||
 
 switch( json_object_get_type( value ) {
      case json_type_string:  /*       */
        data.insert( key, json_object_get_string(value) )
      break;
 
      case json_type_int: /*      */
        data.insert( key, json_object_get_in(value) )
      break;
 
      default: /*           */
      break;
 }
...

ここで実例解析クラスが来て、JSONを直接QVariantに解析しました.唯一の欠点は、エラー処理がないことです.具体的な方法は、json-cのリリースドキュメントをご自身で参照ください.
json_parser.h
 
#ifndef JSONDATAPARSER_H
#define JSONDATAPARSER_H
 
#include 
#include 
#include 
#include 
#include 
 
extern "C"{
#include 
#include 
#include 
#include 
#include 
#include 
};
 
class JsonDataParser
{
public:
    JsonDataParser();
    QVariant parse( QByteArray, unsigned short &status );
 
private:
    QList parseArray( struct json_object *, unsigned short &status );
    QMap parseObject( struct json_object *, unsigned short &status );
    QVariant getData(struct json_object *, unsigned short & );
 
    QTextCodec *codec;
};
 
#endif // JSONDATAPARSER_H
 
json_parser.cpp
#include 
 
#include "JsonDataParser.h"
 
JsonDataParser::JsonDataParser()
{
     codec = QTextCodec::codecForName("UTF-8");
}
 
QVariant JsonDataParser::parse(QByteArray sdata,unsigned short &status ){
    QVariant data;
    struct json_object *obj;
    obj = json_tokener_parse(sdata.data() );
 
    data = getData(obj,status);
    return data;
}
 
QList JsonDataParser::parseArray(struct json_object *array, unsigned short &status ){
    QList data;
    struct json_object *t_obj;
 
//qDebug()< JsonDataParser::parseObject(struct json_object *obj, unsigned short &status ){
    QMap data;
 
   // struct json_object *key_obj, *val_obj;
//qDebug()<toUnicode( json_object_get_string(obj) ) ) );
            break;
 
            case json_type_boolean:
                data=( QVariant( json_object_get_boolean(obj) ) );
            break;
 
            case json_type_int:
                data=( QVariant( json_object_get_int(obj)));
            break;
 
            case json_type_double:
                data= QVariant( json_object_get_double(obj) );
            break;
 
            default:
                data = QVariant();
            break;
    }
 
    return data;
}