0

いくつかの背景

元々は Mac でプロジェクトを作成していましたが、今は Linux マシンを同じプロジェクトに使用したいと考えています。設定フォルダーは以下に依存していました。

#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonParseError>

これらは、SL5 の qt-devel インストールには含まれていませんでした。QT v4 を使用しています。そこで、Sourceforge から QJsonをダウンロードし、cmake を使用してインストールしました。出力例:

--Installing: /usr/include/qjson/parser.h
--Installing /usr/lib/libqjson.so

それはいいです。だから私は私の.proに追加しました:

LIBS += -L/usr/lib/ -lqjson
INCLUDEPATH += /usr/include/qjson/

実際の問題

ここで、古いsettings.cppファイルを変換して、このわずかに新しい方法でデータを解析するタスクがあります。

{
  "HwDescription": {
    "ConnectionsName": "file://settings/connections.xml",
    "ShelveId": 0,
    "BeBoard": {
      "Id": 10,
      "connectionId": "board0",
      "boardType": "GLIB"
    }, // + more boring stuff

したがって、以前の作業方法で行ったのと同じように、上記の json を QString に入れ、指示に従って解析を試みます。私は使用しました:#include <qjson/parser.h>ここで前方宣言は必要ないと思います。

    QJson::Parser parser;
    bool ok;
    QVariantMap result = parser.parse (raw_json, &ok).toMap(); //where raw_json is a QString - this is where I get an error
    if (!ok)
    {
      qFatal("An error occured during parsing");
      exit (1);
    }

私が得るエラー:

エラー: 'Qjson::Parser:parse(QString&, bool) を呼び出す一致する関数がありません

インクルードを削除すると、エラーは次のように表示されます。

QJson が宣言されていません

したがって、少なくともライブラリを見つける必要があります。何がうまくいかないかについてのアイデアはありますか?

4

1 に答える 1

1

QJson では、コメントはデフォルトで解析されません。

これは、コメントを処理するために QJson ロジックで行った小さな適応です。コメントを削除する単純な正規表現に注意してください。

QFile file( filename );

  //File can't be opened!
if ( !file.open( QFile::ReadOnly ) )
{ 
  qDebug("Couldn't load config file: %s", filename.toLatin1().data());
  return;
} 

  //Strip out comments
QStringList list = QString( file.readAll() ).split('\n');
for ( int i = 0; i < list.size(); i++ )
  list[i].replace( QRegExp("//[^\"]*$"), "" );

//Load the file, converting into an object file
QJsonParseError e;
QJsonObject json = 
  QJsonDocument::fromJson( list.join('\n').toLatin1(), &e ).object();

//Was there an error?
if ( e.error != QJsonParseError::NoError )
{ 
  qDebug( "Json parse error: %s", e.errorString().toLatin1().data() );
  return;
}
于 2014-09-15T11:17:34.557 に答える