BlackBerry从URL读取json字符串

时间:2013-05-21 11:16:30

标签: blackberry blackberry-simulator blackberry-jde blackberry-eclipse-plugin

我尝试读取json字符串loading from an URL,但我找不到完整的代码示例。任何人都可以提供或指向我完整的客户端代码。我是BB开发的新手。

this是我所做的,但仍然无法让它工作,请帮助我。

谢谢!

1 个答案:

答案 0 :(得分:2)

要从URL中读取和解析数据,您需要实现两个例程。其中第一个将处理通过HTTP连接从指定的URL读取数据,第二个将解析数据。

检查以下应用程序 HttpUrlReaderDemoApp ,它将首先从指定的URL读取数据,然后解析检索到的数据。

类:

  • HttpUrlReaderDemoApp - UiApplication实例
  • HttpResponseListener - 用于通知其他类有关HTTP请求状态的接口
  • HttpUrlReader - 从给定网址读取数据
  • AppMainScreen - MainScreen实例
  • DataParser - 解析数据
  • DataModel - 数据定义

截图:

  • 请求数据

    Request for data

  • 成功检索数据

    When data retrieved successfully

  • 解析数据

    Parsed data

实现:

HttpUrlReaderDemoApp

public class HttpUrlReaderDemoApp extends UiApplication {
    public static void main(String[] args) {
        HttpUrlReaderDemoApp theApp = new HttpUrlReaderDemoApp();
        theApp.enterEventDispatcher();
    }

    public HttpUrlReaderDemoApp() {
        pushScreen(new AppMainScreen("HTTP Url Reader Demo Application"));
    }
}

HttpResponseListener

public interface HttpResponseListener {
    public void onHttpResponseFail(String message, String url);

    public void onHttpResponseSuccess(byte bytes[], String url);
}

HttpUrlReader

public class HttpUrlReader implements Runnable {
    private String url;
    private HttpResponseListener listener;

    public HttpUrlReader(String url, HttpResponseListener listener) {
        this.url = url;
        this.listener = listener;
    }

    private String getConncetionDependentUrlSuffix() {
        // Not implemented
        return "";
    }

    private void notifySuccess(byte bytes[], String url) {
        if (listener != null) {
            listener.onHttpResponseSuccess(bytes, url);
        }
    }

    private void notifyFailure(String message, String url) {
        if (listener != null) {
            listener.onHttpResponseFail(message, url);
        }
    }

    private boolean isValidUrl(String url) {
        return (url != null && url.length() > 0);
    }

    public void run() {
        if (!isValidUrl(url) || listener == null) {
            String message = "Invalid parameters.";
            message += !isValidUrl(url) ? " Invalid url." : "";
            message += (listener == null) ? " Invalid HttpResponseListerner instance."
                    : "";
            notifyFailure(message, url);
            return;
        }

        // update URL depending on connection type
        url += DeviceInfo.isSimulator() ? ";deviceside=true"
                : getConncetionDependentUrlSuffix();

        // Open the connection and retrieve the data
        try {
            HttpConnection httpConn = (HttpConnection) Connector.open(url);
            int status = httpConn.getResponseCode();
            if (status == HttpConnection.HTTP_OK) {
                InputStream input = httpConn.openInputStream();
                byte[] bytes = IOUtilities.streamToBytes(input);
                input.close();
                notifySuccess(bytes, url);
            } else {
                notifyFailure("Failed to retrieve data, HTTP response code: "
                        + status, url);
                return;
            }
            httpConn.close();
        } catch (Exception e) {
            notifyFailure("Failed to retrieve data, Exception: ", e.toString());
            return;
        }
    }
}

AppMainScreen

public class AppMainScreen extends MainScreen implements HttpResponseListener {
    private final String URL = "http://codeincloud.tk/json_android_example.php";

    public AppMainScreen(String title) {
        setTitle(title);
    }

    private MenuItem miReadData = new MenuItem("Read data", 0, 0) {
        public void run() {
            requestData();
        }
    };

    protected void makeMenu(Menu menu, int instance) {
        menu.add(miReadData);
        super.makeMenu(menu, instance);
    }

    public void close() {
        super.close();
    }

    public void showDialog(final String message) {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.alert(message);
            }
        });
    }

    private void requestData() {
        Thread urlReader = new Thread(new HttpUrlReader(URL, this));
        urlReader.start();
        showDialog("Request for data from\n \"" + URL + "\"\n started.");
    }

    public void onHttpResponseFail(String message, String url) {
        showDialog("Failure Mesage:\n" + message + "\n\nUrl:\n" + url);
    }

    public void onHttpResponseSuccess(byte bytes[], String url) {
        showDialog("Data retrived from:\n" + url + "\n\nData:\n"
                + new String(bytes));

        // now parse response
        DataModel dataModel = DataParser.getData(bytes);
        if (dataModel == null) {
            showDialog("Failed to parse data: " + new String(bytes));
        } else {
            showDialog("Parsed Data:\nName: " + dataModel.getName()
                    + "\nVersion: " + dataModel.getVersion());
        }
    }
}

DataParser

public class DataParser {
    private static final String NAME = "name";
    private static final String VERSION = "version";

    public static DataModel getData(byte data[]) {
        String rawData = new String(data);
        DataModel dataModel = new DataModel();

        try {
            JSONObject jsonObj = new JSONObject(rawData);
            if (jsonObj.has(NAME)) {
                dataModel.setName(jsonObj.getString(NAME));
            }
            if (jsonObj.has(VERSION)) {
                dataModel.setVersion(jsonObj.getString(VERSION));
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        return dataModel;
    }
}

DataModel

public class DataModel {
    private String name;
    private String version;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String model) {
        this.version = model;
    }
}