2013-04-09 48 views
37

Qt5 có trình phân tích JSon mới và tôi muốn sử dụng nó. Vấn đề là nó không phải là quá rõ ràng về những gì các chức năng làm trong điều khoản của giáo dân và làm thế nào để viết mã với nó. Điều đó hoặc tôi có thể đọc nó sai.Cách tạo/đọc/ghi các tệp JSon trong Qt5

Tôi muốn biết mã tạo tệp Json trong Qt5 và ý nghĩa "đóng gói".

+0

http://qjson.sourceforge.net/ –

+0

Min Lin: QJson là loại lỗi thời với Qt5 (không chắc chắn nó thậm chí được chuyển), vì nó mang lại việc thực hiện Json của riêng mình. Jim Kieger: Bạn đã thử cái gì? –

+0

[Trang tham chiếu] (https://qt-project.org/doc/qt-5.0/qtcore/qjsondocument.html) có các hàm QJsonDocument :: QJsonDocument() và QJsonDocument :: QJsonDocument (const QJsonDocument & other) .Tôi đã thử QJsonDocument nhưng nó dường như không tạo ra bất cứ điều gì. –

Trả lời

71

Ví dụ (vì 1 không phải là một tài liệu json hợp lệ, trong khi {foo: 1} là.): Đọc json từ file

/* 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(); 
    } 

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" 

Ví dụ: Đọc json từ chuỗi

json Gán chuỗi như sau và sử dụng readJson() chức năng hiển thị trước khi:

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

Tôi tìm thấy ví dụ này thực sự tốt một ngôi sao sáng bóng của hy vọng và đã làm theo các ví dụ cho bức thư. Tuy nhiên, khi tôi gỡ lỗi ví dụ, các giá trị của các mục được hiển thị là rỗng. Đây có phải là ví dụ duy nhất "từng bước" về cách tạo, đọc và viết một tệp JSON trong QT không? Tôi không thể hiểu được tôi có thể làm gì sai. Sử dụng QT Creator 3.0.1. Cảm ơn – Shawn

+0

@Shawn Trong tab Trợ giúp trong QT Creator, hãy tìm kiếm Ví dụ về Lưu trò chơi JSON. Điều này cho thấy mọi thứ cần làm để đọc và ghi các giá trị JSON (bao gồm cả mảng). [Ví dụ về trò chơi lưu JSON] (http://qt-project.org/doc/qt-5/qtcore-savegame-example.html) –

+0

Bạn có thể bỏ qua chuyển đổi utf-8 byte thành utf-16 và ngược lại (QString, ' toUtf8() ') nếu bạn sử dụng' QByteArray' thay thế. – jfs

-1

Ví dụ về cách sử dụng điều đó sẽ tuyệt vời. Có một vài ví dụ tại số Qt forum, nhưng bạn nói đúng rằng tài liệu chính thức sẽ được mở rộng.

QJsonDocument thực sự không tạo ra bất kỳ thứ gì, bạn sẽ phải thêm dữ liệu vào đó. Điều đó được thực hiện thông qua các lớp học QJsonObject, QJsonArrayQJsonValue. Các mục cấp cao nhất đều cần phải được một mảng hoặc một đối tượng

+1

Sau khi nhìn vào điều này, tôi nghĩ rằng tôi sẽ ở lại với QSettings thay vì sử dụng JSon cho những thứ nhất định. Cảm ơn bạn đã giúp đỡ. –

0

Đáng buồn , nhiều thư viện JSON C++ có Các API không tầm thường để sử dụng, trong khi JSON được dự định là dễ sử dụng. Vì vậy, tôi đã thử jsoncpp từ gSOAP tools trên tài liệu JSON được hiển thị trong một trong các câu trả lời ở trên và đây là mã được tạo với jsoncpp để xây dựng một đối tượng JSON trong C++, sau đó được viết ở định dạng JSON thành std :: 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; 

và đây là mã được tạo bởi jsoncpp để phân tích JSON từ std :: cin và trích xuất các giá trị của nó (thay thế USE_VAL khi cần thiết):

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]); 
    } 
} 

mã này sử dụng JSON C++ API của gSOAP 2.8.28. Tôi không mong đợi mọi người thay đổi thư viện, nhưng tôi nghĩ sự so sánh này giúp đưa các thư viện JSON C++ vào quan điểm.

Các vấn đề liên quan