GWT:处理传入的JSON字符串

时间:2010-08-16 02:34:24

标签: java json gwt

我正在处理一个正在接收JSON字符串的GWT应用程序,而且我很难找到每个对象的值。我正在尝试将传入的JSON字符串传输到对象数组中。

这是JSON(来自Firebug响应选项卡),“d”是.NET的东西(Web服务被消费是C#。

{
    "d": [
        {
            "__type": "Event",
            "ID": 30,
            "Bin": 1,
            "Date": "\/Date(1281544749000)\/",
            "Desc": "Blue with white stripes.",
            "Category": "1"
        },
        {
            "__type": "Event",
            "ID": 16,
            "Bin": 3,
            "Date": "\/Date(1281636239000)\/",
            "Desc": "Yellow with pink stripes",
            "Category": "1"
        }

    ]
}

我正在尝试将JSON解析为对象,然后将它们插入到数组中。我可以使用Window.alert并让整个“d”对象回显。但是,当我尝试访问数组的元素时,GWT调试器就崩溃了。

//My GWT array to receive JSON Array
ArrayList<Item> itemInfo = new ArrayList<Item>();

//Getting response JSON into something I can work with.(THIS FAILS) 
JSONArray jsonValue = JSONParser.parse(incomingJsonRespone);

//Just trying to verify I'm getting values 
for (int i=0; i<jsonValue.size(); i++) {
    JSONValue jsonItem =  = JsonValue.get(i).getString();
    Window.alert(jsonItem);
    itemInfo.add(jsonItem);

}

我认为我已将问题缩小到创建JSONArray实例的位置。我是如何尝试这样做的,这有什么明显的错误,因为我在错误信息方面得不到多少帮助?

2 个答案:

答案 0 :(得分:18)

回应RMorrisey的评论:
实际上,它更复杂:/它看起来像这样(代码未经测试,但你应该得到一般的想法):

JSONValue jsonValue;
JSONArray jsonArray;
JSONObject jsonObject;
JSONString jsonString;
jsonValue = JSONParser.parseStrict(incomingJsonRespone);
// parseStrict is available in GWT >=2.1
// But without it, GWT is just internally calling eval()
// which is strongly discouraged for untrusted sources

if ((jsonObject = jsonValue.isObject()) == null) {
    Window.alert("Error parsing the JSON");
    // Possibilites: error during download,
    // someone trying to break the application, etc.
}

jsonValue = jsonObject.get("d"); // Actually, this needs
                                 // a null check too
if ((jsonArray = jsonValue.isArray()) == null) {
    Window.alert("Error parsing the JSON");
}

jsonValue = jsonArray.get(0);
if ((jsonObject = jsonValue.isObject()) == null) {
    Window.alert("Error parsing the JSON");
}

jsonValue = jsonObject.get("Desc");
if ((jsonString = jsonValue.isString()) == null) {
    Window.alert("Error parsing the JSON");
}

Window.alert(jsonString.stringValue()); // Finally!

正如您所看到的,当使用JSONParser时,您必须/应该非常谨慎 - 这就是重点,对吧?要解析不安全的JSON(否则,就像我在评论中建议的那样,你应该使用JavaScript Overlay Types)。你得到一个JSONValue,检查一下你认为它应该是什么,例如JSONObject,你得到JSONObject,检查它是否有“xyz”键,你得到a JSONValue,冲洗并重复。不是最有趣的工作,但至少比在整个JSON上调用eval()更安全:) 注意:正如杰森指出的那样,在GWT 2.1之前,JSONParser在内部使用eval()(它只有parse()方法 - GWT 2.0 javadocs vs GWT 2.1)。在GWT 2.1中,parse()被弃用,引入了另外两种方法 - parseLenient()(内部使用eval())和parseStrict()(安全方法)。如果你真的必须使用JSONParser,那么我建议你升级到GWT 2.1 M2,否则你不妨使用JSO。作为不受信任来源JSONParser的替代方案,您可以尝试整合json2.js as a JSON parser via JSNI

PS:cinqoTimo,JSONArray jsonValue = JSONParser.parse(incomingJsonRespone);显然不起作用,因为JSONParser.parse的返回类型为JSONValue,而不是JSONArray - 不是您的IDE(Eclipse + Google)插件?)警告你?或者至少是编译器。

答案 1 :(得分:2)

看起来你没有数组,只有一个根对象,其属性名为'd'是一个数组。我不熟悉那个特定的API,但也许您可以尝试检索JSONObject或类似的而不是数组?