如何在QML应用中使用Javascript解析JSON

很多QML应需要访问web services。我们可以通过Javascript的方法来解析得到我们所需要的JSON数据,并把它们展示出来。在今天的例子中,我们将展示如何实现它?

我们可以创建一个最基本的“QML App with Simple UI (qmlproject)”,并取名我们的应用为“baidutranslator”。我们将使用的API为:

http://openapi.baidu.com/public/2.0/bmt/translate?client_id=2hG67S2yRm5chkr62j2IEmYL&from=auto&to=auto&q=%E4%BD%A0%E5%A5%BD

显示的结果为:

{"from":"zh","to":"en","trans_result":[{"src":"\u4f60\u597d","dst":"Hello"}]}

我们可以通过这个API的接口来得到中文或英文的翻译,甚至我们可以得到一个完整句子的中文或英文。上面接口返回的结果是JSON格式的。

为了能够解析我们得到的JSON格式,我们创建了一个“jsonparser.js”文件:

var URL = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=2hG67S2yRm5chkr62j2IEmYL&from=auto&to=auto&q=";

function startParse(keyword, callback) {
    var doc = new XMLHttpRequest();
    doc.onreadystatechange = function() {
        if (doc.readyState == XMLHttpRequest.HEADERS_RECEIVED) {
        } else if (doc.readyState === XMLHttpRequest.DONE) {
            if(doc.status != 200) {
                console.log("!!!Network connection failed!")
            }
            else {
                console.log("got some results!");
                if(doc.responseText == null) {
                }
                else {
                    console.log("result: ", doc.responseText)
                    var json = JSON.parse('' + doc.responseText+ '');
                    json["status"] = "OK";
                    callback.update(json);
                }
            }
        }
    }

    doc.open("GET", URL + keyword);
    doc.send();
}

我们通过“startParse”来发送请求,并通过JSON.parse()来解析我们得到的结果。我们通过“callback.update”来返回到我们的QML设计中。

Main.qml”的设计如下:

import QtQuick 2.0
import Ubuntu.Components 1.1
import "jsonparser.js" as API

/*!
    \brief MainView with a Label and Button elements.
*/

MainView {
    id: root

    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "baidutranslator.liu-xiao-guo"

    /*
     This property enables the application to change orientation
     when the device is rotated. The default is false.
    */
    //automaticOrientation: true

    // Removes the old toolbar and enables new features of the new header.
    useDeprecatedToolbar: false

    width: units.gu(60)
    height: units.gu(85)

    function update(json) {
        console.log("json: " + JSON.stringify(json));

        mymodel.clear();

        if ( json.trans_result !== undefined && json.trans_result.length !== undefined ) {
            for ( var idx = 0; idx < json.trans_result.length; idx++ ) {
                if ( json.trans_result[ idx ].dst ) {
                    console.log( 'meaning: ' + json.trans_result[ idx ].dst);
                    mymodel.append( {"meaning": json.trans_result[ idx ].dst });
                }
            }
        } else {
            mymodel.clear();
        }
    }

    Page {
        title: i18n.tr("Baidu translator")

        ListModel {
            id: mymodel
        }

        Column {
            spacing: units.gu(1)
            anchors {
                margins: units.gu(2)
                fill: parent
            }

            TextField {
                id: input
                placeholderText: "Please input a word"
                width: parent.width
                text: "你好"

                onTextChanged: {
                    mymodel.clear();
                    var json = API.startParse(input.text, root);
                }
            }

            Button {
                id: doit
                width: parent.width

                text: i18n.tr("Translate")

                onClicked: {
                    var json = API.startParse(input.text, root);
                }
            }

            ListView {
                id: listview
                width: parent.width
                height: parent.height - input.height - doit.height
                model: mymodel

                delegate: Text {
                    text: modelData
                }

            }
        }
    }
}

这里我们通过“update”来更新我们的ListView。

  

所有项目的源码是在:git clone https://gitcafe.com/ubuntu/baidutranslator.git

时间: 2024-08-30 01:32:31

如何在QML应用中使用Javascript解析JSON的相关文章

如何在QML应用中使用Javascript来解析XML

我们知道有很多的web services是使用XML格式的,我们可以通过使用XmlListModel来解析我们的XML.但是在有些情况下,我们可能需要使用Javascript来解析XML,这样使得我们可以更加灵活地解析我们所需要的XML数据.比如,通过一个请求,我们可以来解析XML结果中的多个数据.比较而言,XmlListModel只能对XPath路经下(由source属性定义)的数据进行解析.如果需要多个路径,可以通过多次对不同的路径进行查询.当然,我们可能需要一些方法来同步这些查询(如果最终

如何在QML应用中启动Scope

在这篇文章中,我们将介绍如何在QML应用中调用Scope,并把搜索的关键词传进去.这对有些QML应用需要用到Scope的情况非常有用.更多关于url-dispatcher的知识,请在文章"使用URL dispatcher的范例"看到. Scope ID 首先我们来讲一下什么是Scope ID.我们打开我们创建的任何一个Scope的manifest.json文件: { "architecture": "@[email protected]", &q

Android中使用Gson解析JSON数据的两种方法

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组

如何在QML应用中实现一个Splash画面

在QML应用中,我们经常要用到一个SplashScreen的画面来渲染我们的应用.那么我们怎么在自己的应用中做一个Splash Screen呢? 首先我们来设计一个自己的SplashScreen的QML模块: SplashScreen.qml import QtQuick 2.0 Item { id: splash anchors.fill: parent property int timeoutInterval: 2000 signal timeout Image { id: splashIm

如何在QML应用中读写文件

我们知道,在QML应用中,有时我们需要来读写一些文件,但是在我们的QML语言中并没有相应的API接口来供我们做(虽然有API接口来存储设置文件等).那么我们怎么来做这个事情呢?我们可以通过Qt C++的方法来实现这个功能. 1)创建一个简单的模版应用 我们使用Ubuntu SDK的模版来创建一个最简单的应用:      我们选择"QML App with C++ plugin"模版来做我们的应用. 2)添加文件读写的文件到项目中 我们添加如下的C++ "FileIO类到我们的

如何在QML应用中得到一个Item的所有属性,信号及方法

Item是QML语言中最基本的元素.有时为了方便,我们可以列出它里面的所有的属性,信号及方法.我们可以通过这个方法来修改我们的属性等.在QML语言中,所有的可视的控件都是继承于Item的. 下面我们来通过一个例子来展示如何这么做.我们可以设计一个简单的QML应用如下: import QtQuick 2.0 import Ubuntu.Components 1.1 /*! \brief MainView with a Label and Button elements. */ MainView {

如何在QML应用中调用系统设置中的页面来设置我们的系统

我们在QML应用中有时需要调用系统设置(system settings)来完成我们的一些设置.比如,我们在使用GPS来定位时,可能GPS并没有打开,如果在我们的应用中直接打开系统中的GPS设置页面,这样我们就可以直接打开系统的GPS而不用单独设计一个页面.我们可以通过使用URL dispatcher的方法来打开另外一个应用.在先前的我们的文章中,我们已经讲述了很多关于URL dispatcher方面的东西: 怎么在Ubuntu手机上发送短信及拨打电话 使用URL dispatcher的范例 关于

JS中生成与解析JSON

js中生成json对象 js中解析json字符串: 1.eval("..."): var a_id=eval('{"name":123}'); 如果eval中的内容含有恶意脚本就麻烦了 2.json_parse: 需要导入json_parse.js: <script src="js/json_parse.js"></script>    <script language="javascript"&

Java中构造和解析JSON

什么是 Json? JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式.  易于人阅读和编写.同时也易于机器解析和生成.它基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集.  JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C, C++, C#