2015-04-01 97 views
0

我需要解析JSON文件并将数据放入HTML表格中。我为这个应用程序使用GWT,数据将从服务器端的文件中读取,并在页面加载时传递给客户端。是解析复杂的JSON文件

的文件中的一个JSONObjects的格式如下:

{ 
"Object 1": [ 
{ "value1": [ "subKey1", "subValue2" ], "value2": "val", "value3": { "key1": val1, "key2": val2, "key3": val3} }, 
{ "value2": [ "subKey1", "subValue2" ], "value2": "val", "value3": { "key1": val1, "key2": val2, "key3": val3} }, 
.... 
.... 
], 

"Object 2": [ 
{ "value1": [ "subKey1", "subValue2" ], "value2": "val", "value3": { "key1": val1, "key2": val2, "key3": val3} }, 
{ "value2": [ "subKey1", "subValue2" ], "value2": "val", "value3": { "key1": val1, "key2": val2, "key3": val3} }, 
.... 
.... 
], 
.... 

} 

到现在为止,我只是做了简单的JSON解析。我在这里遇到的问题是我正在使用的数据具有每个对象的唯一名称,所以我似乎无法将它们解析为JSONObjects数组。

我试图解析它们(使用JSON简单)这种方式,但我抛出一个错误。

try { 
     JSONParser parser = new JSONParser(); 
     JSONObject obj; 
      obj = (JSONObject) parser.parse(new FileReader("file.json")); 

     JSONArray array = new JSONArray(); 
     array.add(obj.get("Object1")); 
     array.add(obj.get("Object2")); 
     array.add(obj.get("Object3")); 
     array.add(obj.get("Object4")); 

     JSONObject jo; 

     for (Object o : array) { 
      jo = (JSONObject) o; 
     } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

但是,这将引发一个错误:

org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject 

从我的理解另一种方法是创建一个对象,但因为每个的JSONObject有不同标识的POJO类,这是否意味着每个对象必须它自己独特的课程?我使用的一些JSON2Java方法只是为它们中的每一个创建一个新类。

+0

为什么不直接传递JSON的GWT应用程序?为什么解析它的服务器端? – 2015-04-01 11:33:57

+0

那也是另一个选择,我只是想知道如何将数据结构化为表格。我想为数据做一个POJO会让它更容易。 – GreenGodot 2015-04-01 11:37:49

+1

JSON _is_ JavaScript!在JavaScript中处理它比在Java中处理容易1000倍。好的,也许这有点夸张。但是在客户端免费解析**,因为它已经是JavaScript对象了 - 名字中的线索......我会从[阅读教程]开始(http://www.gwtproject.org/doc/latest /tutorial/JSON.html) - 覆盖类型真的很神奇。 – 2015-04-01 11:39:57

回答

1

可以铸造前检查对象的实例:

for (Object obj : array) { 
    if (obj instanceof JSONArray) { 
     // It's an array 
     yourJsonArray = (JSONArray)obj; 
    } else if (obj instanceof JSONObject) { 
     // It's an object 
     yourJsonObject = (JSONObject)obj; 
    } else { 
     // It's string, number... 
    } 
} 
+1

我认为这是一个XY问题 - 因为OP试图解析JSON服务器端,通过RPC将它发送到GWT前端;即对其进行反序列化,将其序列化,然后再次对其进行反序列化。虽然这无疑是解决OP所遇到的确切问题的一种方法,但我不相信这是对潜在问题的正确答案。 – 2015-04-01 11:45:38

+1

@BoristheSpider你是对的!也许它不能解决主要问题,但它应该解决他尝试的例外问题。 – Rami 2015-04-01 12:09:57