2012-01-13 55 views
2

我从JavaScript传递一个json对象到使用ajax的java servlet。Java的JSONArray从Javascript JSONArray

var jsonObj = JSON.stringify(objArray); //Then I pass it to Java using ajax. 

在我的Java,我从请求获取JSON字符串,然后创建一个jsonarray,然后通过数组循环,并试图拉从数组中JSON对象之一,当我得到的错误。

String dataObj = request.getParameter("obj"); 
String sql = request.getParameter("sql"); 
ArrayList<Object> returnArray = new ArrayList<Object>(); 
int key; 

//Get type of object being passed. 
JSONArray jsonArray = JSONArray.fromObject(dataObj);  
for(int i=0; i<jsonArray.size(); i++) { 
    String obj = new Gson().toJson(jsonArray.getJSONObject(i)); //This is where i'm getting an error 
    String className = getClassName(jsonArray.getJSONObject(i)); 

    Class targetClass = null; 
     try { 
      targetClass = Class.forName(className); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

    //Create Object 
    Object data = new Gson().fromJson(obj, targetClass); 

我张贴的相关代码,for循环不会关闭,因为该代码的其余部分是相当长的,而这正是我得到错误的部分。

net.sf.json.JSONException: JSONArray[0] is not a JSONObject. 

这是什么json数组看起来像从JavaScript传入时。这是jsonArray对象的println。

[{"number":"(123) 456-7050","type":"Home","contactId":1,"id":16662,"className":"beans.PhoneNumber","position":0}] 

这段代码有一个对象,这段代码有效。但一旦我得到2或更多,我的错误出现了。

[[{"number":"(123) 456-7050","type":"Home","contactId":1,"id":16662,"className":"beans.PhoneNumber","position":1},{"number":"(555) 555-1233","type":"Mobile","contactId":1,"id":16656,"className":"beans.PhoneNumber","position":0},{"number":"(999) 999-9999","type":"Home","contactId":1,"id":16664,"className":"beans.PhoneNumber","position":3},{"number":"(222) 222-2222","type":"Home","contactId":1,"id":16666,"className":"beans.PhoneNumber","position":4}]] 

它几乎看起来当我路过一个以上的对象一样,它创建一个数组,这可能是为什么它不工作的数组。但是当我从javascript传递一个jsonarray时,我该如何避免这样做呢?只使用dataObj,我无法访问大小或无法循环访问它。

回答

1
[ 
    [ 
     { 
      "number":"(123) 456-7050","type":"Home", 
      "contactId":1, 
      "id":16662, 
      "className":"beans.PhoneNumber", 
      "position":1 
     }, 
     { 
      "number":"(555) 555-1233", 
      "type":"Mobile", 
      "contactId":1, 
      "id":16656, 
      "className":"beans.PhoneNumber", 
      "position":0 
     }, 
     { 
      "number":"(999) 999-9999", 
      "type":"Home", 
      "contactId":1, 
      "id":16664, 
      "className":"beans.PhoneNumber", 
      "position":3 
     }, 
     { 
      "number":"(222) 222-2222", 
      "type":"Home", 
      "contactId":1, 
      "id":16666, 
      "className":"beans.PhoneNumber", 
      "position":4 
     } 
    ] 
] 

这不是一个对象数组。这是一组对象数组。根据你的描述,你期待类似以下被输送到你的Java:

[{"foo":"bar"}, {"bar":"baz"}] 

但你确实试图解析:

[[{"foo":"bar"}, {"bar":"baz"}]] 
+0

当我在java中创建JSONArray时,它正在创建数组数组。所以我想原始dataObj字符串已经是一个数组,但我该如何转换为在Java中使用,所以我可以使用for循环等? – ryandlf 2012-01-13 14:26:20

+0

看看你的JavaScript。您似乎有一个将对象添加到数组的错误。我不能告诉你其他什么,因为你没有提供任何JavaScript上下文。 – 2012-01-13 14:35:20

+0

在我的javascript我转换对象的数组,我在想什么是一个正确的jsonArray使用stringify。我证实这是问题,但我不知道如何避免它。在我调用javascript中数组的stringify之前,它是一个完美的JS数组。我是否应该以不同的方式为Java准备解析它? – ryandlf 2012-01-13 14:43:27

0

我不完全确定,因为你没有共享你正试图解析的json,但是你得到的最可能的错误正是它所说的:数组的第一个元素不是JSONObject。请注意,字符串值,lons和布尔值不是JSONObjects。我建议你使用更基因的JSONArray.get并检查它是什么类的实例。也许这可能会导致你遇到json问题。如果我完全弄错了 - 写回来,我会尽力帮忙。在这种情况下,分享所提议实验的结果仍然很有用。

编辑: 这是双数组 - >也许你使用getJSONArray(int index)会帮助你。作为提到的其他答案 - 这是数组的数组。还要考虑更改JavaScript以降低包含的数组的级别。

+0

获取也不起作用。我假设我以某种方式错误地构建阵列。我正在编辑这个问题,以包括从javascript传入的json数组的样子。 – ryandlf 2012-01-13 14:07:59

+0

请参阅上面的评论。当我在javascript中使用stringify转换javascript数组时,发生错误,但我不知道如何将它转换为java的准备? – ryandlf 2012-01-13 14:44:20