Как правильно использовать объекты JSArray <T>из JsonUtils.safeEval ()? - PullRequest
0 голосов
/ 05 июля 2019

Я читаю статический файл JSON, используя RequestBuilde, и подтвердил, что вижу ожидаемый JSON в методе ответа .getText ().Я сократил то, что я делаю, чтобы попытаться выяснить точную проблему.Это примерно так, как я могу делать вещи.

Я использую JsonUtils.safeEval (), чтобы проанализировать ответ в моем типе наложения и передать результат в функцию, которая будет выплевывать результаты на страницу.Очевидно, что в этом методе есть что-то еще, но я для краткости оставил это.

@Override
public void onResponseReceived(Request request, Response response) {    
    JsArray<JSONLeadTime> tmp = JsonUtils.<JsArray<JSONLeadTime>>safeEval(response.getText());
    if (200 == response.getStatusCode()) {
        renderLeadTimes(tmp);
    } else {
        AlertWindow.displayAlert(ERRORS.GENERIC_CLIENT_ERROR);      
    }
}

Вот определение типа наложения, для справки.Для записи также определен тип наложения «оборудование».Вы можете почерпнуть определение из JSON ниже, или я могу включить его в случае необходимости.

public class JSONLeadTime extends JavaScriptObject {
    protected JSONLeadTime() {}
    public final native String getFacility() /*-{ return this.facility; }-*/;
    public final native List<equipment> getEquipment() /*-{ return this.equipment; }-*/;
}

И пример анализируемого JSON:

[{
    "JSONLeadTime": {
        "facility": "Temperance",
        "equipment": [{
            "name": "Coil Line",
            "value": "coil-line",
            "lead-time": 2,
            "sales-router-id": [76]
        }]
    }
}]

Когда я пытаюсьперебирайте JSArray, все нормально, пока я не попытаюсь получить доступ к методам оверлейного типа.Вот метод, который выплевывает результаты.Когда я вызываю leadTimes.get (i), я вижу, что "leadTime" - это JavaScriptObject, чего я и ожидал в этот момент.Когда я вызываю "leadTime.getFacility ()", я получаю NPE.

protected void renderLeadTimes(JsArray<JSONLeadTime> leadTimes) {
    SafeHtmlBuilder sb = new SafeHtmlBuilder();
    for (int i=0; i < leadTimes.length(); i++) {
        JSONLeadTime leadTime = leadTimes.get(i);
        sb.appendEscaped(leadTime.getFacility()); //This is where I get the NPE
        if ( leadTime.getEquipment() != null ) {
            for ( int  x=0; x < leadTime.getEquipment().size(); x++ ) {
                equipment e = leadTime.getEquipment().get(x);
                sb.appendEscaped(" - " + e.getName());
            }
        }
    }       
    view.getDivLeadTimes().setInnerSafeHtml(sb.toSafeHtml());
}

Я в полном недоумении.Я понятия не имею, почему это не работает.Все, что я прочитал, говорит, что это должно работать.Будем благодарны за любые идеи, которые стоит попробовать.

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Ваш массив JSON содержит объекты с одним свойством JSONLeadTime, значение которого будет соответствовать вашему типу наложения. Вам не хватает этого промежуточного объекта между JsArray и типом оверлея.

0 голосов
/ 06 июля 2019

В своем коде я сначала создал тип, например:

/**
 * This class may not be directly instantiated, and can only be returned from a
 * native method. For example,
 *
 * <code>
 * native JsArray<JavaScriptObject> getNativeArray() /*-{
 *   return [
 *     { x: 0, y: 1},
 *     { x: 2, y: 3},
 *     { x: 4, y: 5},
 *   ];
 * }-* /;
 * </code>
 */
public class TeamMembersJso extends JsArray<TeamMemberJso> {

  protected TeamMembersJso() {
  }
}

И затем я оцениваю необработанные данные JSON в экземпляр оверлея JavaScript.

TeamMembersJso jsoData = JsonUtils.safeEval(rawData);

Не уверенесли это связано с прямым использованием JsArray<JSONLeadTime> в вашем коде.Определенно стоит попробовать тот подход, который я использовал, потому что он хорошо работает для меня.

Я использую GWT 2.8.2, но я не думаю, что есть большие различия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...