【Qt】Json parser


目前有許多種選擇。但須注意是否完全支援UTF8。

  1. qt-json http://nilier.blogspot.com/2010/08/json-parser-class-for-qt.html
  2. Qjson http://qjson.sourceforge.net/
  3. JsonQt http://gitorious.org/JsonQt/

目前採用第一個方式,因為第一個方式只需要在原始專案中加入兩個檔案,看起來較為方便。

【目的】

以 AJAX Language API for Translation and Detection 為範例,Translation API 所回傳的結果就是 Json 格式。
假設我們送出下面命令給 Google Translation ,

http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello&langpair=en|ru  
所回傳的結果會是
{"responseData": {"translatedText":"привет"}, "responseDetails": null, "responseStatus": 200}
看起來的結構會像是下面圖形,請住義最後 hello 翻譯成俄文的字串會在 responseData的translatedText。

image

【程式】

下面只擷取重要程式,基本上UI會有一個 push button 用來顯示從 Json 抓出來的字串。 
#include <qDebug>
#include "json.h"

QString json="{\"responseData\" : {\"translatedText\":\"привет\"}, \
               \"responseDetails\" : null, \
               \"responseStatus\" : 200}";

bool ok;
QVariantMap result = Json::parse(json, ok).toMap();
if(!ok) {
    qFatal("An error occurred during parsing");
    exit(1);
}

QVariantMap responseData = result["responseData"].toMap();
QString translatedText= responseData["translatedText"].toString();

ui->pushButton->setText(QString::fromUtf8(translatedText.toStdString().c_str()));
qDebug() << "translatedText:" << QString::fromUtf8(translatedText.toStdString().c_str());
qDebug() << "responseDetails:" << result["responseDetails"].toBool();
qDebug() << "responseStatus:" << result["responseStatus"].toInt();

【結果】

 image

【問題】

  • 程式也將結果送到 QDebug(),但不知為何привет會變成亂碼,但如果印出中文是沒問題的。
    image

【上面三種方式的個別補充說明】

  1. JSON parser class for Qt
    http://nilier.blogspot.com/2010/08/json-parser-class-for-qt.html
  2. Qjson http://qjson.sourceforge.net/usage.html
  3. JsonQt
    http://git.fredemmott.co.uk/?p=JsonQt;a=blob;f=tests/README.txt;h=4ebcf735ccbff8556914ed687b27f065dfb4a229;hb=HEAD

【其他】

 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com