GWT - как дескриптор вернул Json как примитивный тип - PullRequest
0 голосов
/ 14 ноября 2011

Мне нужно получить значение от JSON.Он отлично работает с возвращаемыми объектами, но иногда я получаю только значение json - как логическое значение.И я не могу получить его от возвращенного json в GWT.

У меня есть функция getJson () JSNI для получения json, такая же, как в учебнике GWT StockWatcher.Я думаю, это релевантная часть этой функции, где возвращаемая строка преобразуется в JavaScriptObject?

    // [2] Define the callback function on the window object.
        window[callback] = function(jsonObj) {
            // [3]
            handler.@cz.metacentrum.perun.webgui.json.JsonClient::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(jsonObj);
            window[callback + "done"] = true;
        }
    // [4] JSON download has a timeout.
        setTimeout(
                function() {
                    if (!window[callback + "done"]) {
                        handler.@cz.metacentrum.perun.webgui.json.JsonClient::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(null);
                    }

                    // [5] Cleanup. Remove script and callback elements.
                    document.body.removeChild(script);
                    delete window[callback];
                    delete window[callback + "done"];
                }, timeout);

Вызывает функцию-обработчик, которая также основана на учебнике.

    public void handleJsonResponse(JavaScriptObject jso){
    // if an ERROR
    if (jso == null) {
        this.module.onError();
        return;
    }
    // OK
    this.module.onFinished(jso);
}

Проблема в том,,Когда я получаю логическое значение, оно не анализируется как JavaScriptObject, и я в конечном итоге в onError (), вызванном тайм-аутом.

Возвращенная строка json выглядит так: callback5 (true);и он возвращается задолго до истечения времени ожидания.Поэтому я думаю, getJson () просто не может разобрать его?

Как я могу разобрать его в JavaScriptObject для работы с остальной частью моей программы?Я думаю, мне нужен какой-то оператор IF в секции [3] getJson (), чтобы решить, какой тип значения был возвращен и какую функцию обработчика вызвать.Может быть, создать объект вручную из возвращенного значения здесь и затем поместить его в существующий обработчик.Но я не уверен, как это сделать по-настоящему.Я попытался создать overlayType для логического значения, но это не помогло, поскольку возвращаемая строка все равно не анализируется как jso.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 14 ноября 2011

Голые примитивы недопустимы в формате JSON.Строки JSON ( как определено здесь ) должны быть либо объектами JavaScript, либо массивами.Если вы не можете изменить службу, из которой поступают примитивные типы, вы можете дополнить строки, содержащие примитивные типы, чтобы их можно было проанализировать (в один массив элементов):

function padPrimitiveType(json) {
  if (json != null && json[0] != '[' && json[0] != '{') {
    return "[" + json + "]";
  } else {
    return json;
  }
}
...