2013-04-09 108 views
37

Qt5には新しいJSonパーサーがあり、使いたいです。問題は、慣れ親の言葉で機能が何をしているのか、それを使ってコードを書く方法についてあまり明確ではないということです。それとも私はそれを間違って読んでいる可能性があります。Qt5でJSonファイルを作成/読み込み/書き込む方法

Qt5でJsonファイルを作成する際のコードと、「カプセル化」の意味を知りたいと思います。

+0

http://qjson.sourceforge.net/ –

+0

Min Lin:QJsonは、独自のJson実装を導入しているため、Qt5で古くなっています(移植されているかどうかはわかりません)。 Jim Kieger:何を試しましたか? –

+0

[この参照ページ](https://qt-project.org/doc/qt-5.0/qtcore/qjsondocument.html)には、QJsonDocument :: QJsonDocument()および QJsonDocument :: QJsonDocument(const QJsonDocument&その他)関数があります。私はQJsonDocumentを試しましたが、何も作成していないようです。 –

答えて

71

例:ファイル

/* test.json */ 
{ 
    "appDesc": { 
     "description": "SomeDescription", 
     "message": "SomeMessage" 
    }, 
    "appName": { 
     "description": "Home", 
     "message": "Welcome", 
     "imp":["awesome","best","good"] 
    } 
} 


void readJson() 
    { 
     QString val; 
     QFile file; 
     file.setFileName("test.json"); 
     file.open(QIODevice::ReadOnly | QIODevice::Text); 
     val = file.readAll(); 
     file.close(); 
     qWarning() << val; 
     QJsonDocument d = QJsonDocument::fromJson(val.toUtf8()); 
     QJsonObject sett2 = d.object(); 
     QJsonValue value = sett2.value(QString("appName")); 
     qWarning() << value; 
     QJsonObject item = value.toObject(); 
     qWarning() << tr("QJsonObject of description: ") << item; 

     /* in case of string value get value and convert into string*/ 
     qWarning() << tr("QJsonObject[appName] of description: ") << item["description"]; 
     QJsonValue subobj = item["description"]; 
     qWarning() << subobj.toString(); 

     /* in case of array get array and convert into string*/ 
     qWarning() << tr("QJsonObject[appName] of value: ") << item["imp"]; 
     QJsonArray test = item["imp"].toArray(); 
     qWarning() << test[1].toString(); 
    } 

からJSONを読みます

OUTPUT

QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})) 
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) 
"QJsonObject[appName] of description: " QJsonValue(string, "Home") 
"Home" 
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"])) 
"best" 

例:以下のように文字列からJSON

文字列に割り当てJSONを読み、前に示したreadJson()機能を使用します。

val = 
' { 
     "appDesc": { 
      "description": "SomeDescription", 
      "message": "SomeMessage" 
     }, 
     "appName": { 
      "description": "Home", 
      "message": "Welcome", 
      "imp":["awesome","best","good"] 
     } 
    }'; 

OUTPUT悲しいこと

QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})) 
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) 
"QJsonObject[appName] of description: " QJsonValue(string, "Home") 
"Home" 
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"])) 
"best" 
+0

私はこの本当に良い例が明るい輝く輝きのある星を見つけ、この例を手紙に従った。ただし、例をデバッグすると、エントリの値がnullとして表示されます。これは、QTでJSONファイルを作成、読み込み、書き込む方法の「ステップバイステップ」の唯一の例ですか?私は何が間違っているのか理解できません。 QT Creator 3.0.1の使用。ありがとう – Shawn

+0

@Shawn QT Creatorの[ヘルプ]タブで、JSON Save Game Exampleを検索してください。これは、JSON値(配列を含む)を読み書きするために必要なすべてを示しています。 [JSON Save Game Example](http://qt-project.org/doc/qt-5/qtcore-savegame-example.html) –

+0

utf-8バイトをutf-16に変換して戻すことができます(QString、 toUtf8() ')を使用してください。代わりに' QByteArray'を使用してください。 – jfs

-1

これを使用する方法の例は素晴らしいでしょう。 Qt forumにはいくつかの例がありますが、正式な文書を展開するのは間違いありません。

QJsonDocument実際には何も生成されないため、データを追加する必要があります。これは、QJsonObject,QJsonArrayQJsonValueクラスで行われます。 ({foo: 1}である一方1は、有効なJSONドキュメントではないからである。)最上位のアイテムが配列やオブジェクトのいずれかであることが必要である

+1

これを調べた後、特定のものにJSonを使用する代わりにQSettingsにとどまると思います。ご協力いただきありがとうございます。 –

0

を、多くのJSON C++ライブラリにはJSONは使いやすいように意図されていましたが、使用するのは簡単ではないAPIです。

だから、上記の回答のいずれかに示されるJSONドキュメントにgSOAP toolsからjsoncppを試み、これが次にはstdするJSON形式で記述されているC++でJSONオブジェクトを構築するjsoncppで生成されたコードである:: COUT。

value x(ctx); 
x["appDesc"]["description"] = "SomeDescription"; 
x["appDesc"]["message"] = "SomeMessage"; 
x["appName"]["description"] = "Home"; 
x["appName"]["message"] = "Welcome"; 
x["appName"]["imp"][0] = "awesome"; 
x["appName"]["imp"][1] = "best"; 
x["appName"]["imp"][2] = "good"; 
std::cout << x << std::endl; 

これは、STDからJSONを解析するjsoncppによって生成されたコードであり:: CIN、その値を抽出する(必要に応じてUSE_VALを置き換える):

value x(ctx); 
std::cin >> x; 
if (x.soap->error) 
    exit(EXIT_FAILURE); // error parsing JSON 
#define USE_VAL(path, val) std::cout << path << " = " << val << std::endl 
if (x.has("appDesc")) 
{ 
    if (x["appDesc"].has("description")) 
    USE_VAL("$.appDesc.description", x["appDesc"]["description"]); 
    if (x["appDesc"].has("message")) 
    USE_VAL("$.appDesc.message", x["appDesc"]["message"]); 
} 
if (x.has("appName")) 
{ 
    if (x["appName"].has("description")) 
    USE_VAL("$.appName.description", x["appName"]["description"]); 
    if (x["appName"].has("message")) 
    USE_VAL("$.appName.message", x["appName"]["message"]); 
    if (x["appName"].has("imp")) 
    { 
    for (int i2 = 0; i2 < x["appName"]["imp"].size(); i2++) 
     USE_VAL("$.appName.imp[]", x["appName"]["imp"][i2]); 
    } 
} 

このコードはのgSOAPのJSON C++ APIを使用し2.8.28。人々がライブラリを変更することは期待していませんが、この比較がJSON C++ライブラリを視点に置くのに役立つと思います。

関連する問題