如何翻译,在GWT中使用JSON?

时间:2010-04-21 06:21:47

标签: gwt

我是gwt的新手。并且需要知道如何在gwt中使用JSON,所以我尝试这个简单的数据加载器,但我仍然感到困惑 我在eclipse中创建了一个名为'tesdb3'的项目。我创建PHP端来访问数据库,并将输出作为JSON ..
我在文件夹war中创建userdata.php。然后我编译tesdb3项目。文件夹tesdb3和ward中的userdata.php在本地服务器中移动(我使用WAMP)。我把PHP放在文件夹tesdb3中。这是我的localhost / phpmyadmin / tesdb3 / userdata.php

的结果
[{"kode":"002","nama":"bambang gentolet"}{"kode":"012","nama":"Algiz"}]

从那个结果我认为PHP方面运行良好。
然后我创建UserData.java作为JSNI覆盖像这样:

package com.tesdb3.client;
import com.google.gwt.core.client.JavaScriptObject;

class UserData extends JavaScriptObject{
      protected UserData() {}   

      public final native String getKode() /*-{ return this.kode; }-*/;
      public final native String getNama()  /*-{ return this.nama;  }-*/;

      public final String getFullData() {
          return getKode() + ":" + getNama();
      }
}

然后最后在tesdb3.java中:

public class Tesdb3 implements EntryPoint { 

    String url= "http://localhost/phpmyadmin/tesdb3/datauser.php";

    private native JsArray<UserData> getuserdata(String json)
    /*-{ 
        return eval(json); 
    }-*/;

    public void LoadData() throws RequestException{
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));

        builder.sendRequest(null, new RequestCallback(){
            @Override
            public void onError(Request request, Throwable exception) {
                Window.alert("error " + exception);
            }

            public void onResponseReceived(Request request,
                    Response response) {        
            //1                                                         
                            //data(getuserdata(response.getText()));
                            //2
                  JsArray<UserData> uda = JsonUtils.unsafeEval(response.getText()) 
                              data(uda);    
            }
        });
    }

public void data(JsArray<UserData> data){
    for (int i = 0; i < data.length(); i++) {
        String lkode =data.get(i).getKode(); 
        String lname =data.get(i).getNama();                

        Label l = new Label(lkode+" "+lname);
        tb.setWidget(i, 0, l);
      }
    RootPanel.get().add(new HTML("my data"));
    RootPanel.get().add(tb);
} 

    public void onModuleLoad() {        
        try {
            LoadData();
        } catch (RequestException e) {
            e.printStackTrace();
        }
    }
}

我在onResponseReceived中使用的两种方法的结果是相同的。只显示字符串“我的数据”。
但是方法2创建了这样的错误:
14:41:59.875 [错误] [tesdb3]未捕获的异常已转义 com.google.gwt.core.client.JavaScriptException :( SyntaxError):语法错误

我是否错过使用第二种方法?
为什么方法1没有任何错误但无法显示数据?

2 个答案:

答案 0 :(得分:3)

问题是你的JSON语法不正确,你在表的第一项之后缺少一个逗号,它应该是(为了可读性而添加了空格):

[
    {
        "kode": "002",
        "nama": "bambang gentolet" 
    },
    {
        "kode": "012",
        "nama": "Algiz" 
    }
]

由于JSON是JavaScript的一部分,因此可能是您获得的语法错误异常。

PS:我建议使用一些PHP框架为你创建JSON(Zend Framework是我的常用选择)。此外,像JSONLint这样的JSON验证器对于调试JSON非常有用。

答案 1 :(得分:2)

它看起来像是代码中的一个拼写错误,它带来了命名约定:对于变量和方法,使用驼峰大小写,从小写字符开始。因此UserData UD应为UserData ud

在您的getuserdata方法(应为getUserData)中,您使用参数名称Json和大写J以及本地代码jsonj。这解释了错误。

关于getUserData方法。有一种GWT方法:JsonUtils.unsafeEval(json)你应该使用它。

此外,onResponseReceived中的代码似乎不完整,它可能不重要,因为它可能被错误地放在这个示例中,但只是为了完整,这里应该是这样的:

JsArray<UserData> uda = JsonUtils.unsafeEval(response.getText());

for (int i = 0; i < uda.length(); i++) {
  UserData ud = uda.get(i);
  String lKode = ud.getKode(); 
  String lName = ud.getNama();                 
  Label l = new Label(lKode + " " +lName);

  RootPanel.get().add(l);
}