2012-01-13 4 views
2

Я передаю объект json из javascript в Java-сервлет, используя ajax.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); 

Я отправляю соответствующий код, для цикла не закрыт, так как остальная часть кода довольно долго, и это та часть, где я получаю сообщение об ошибке.

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

Вот что представляет собой массив json, когда он прошел через javascript. Это println объекта jsonArray.

[{"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}]] 

Это выглядит почти как когда я прохожу более одного объекта, это создать массив массива, который может быть, почему он не работает. Но как мне избежать этого, когда я передаю jsonarray из javascript? Используя только 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

Когда я создаю JSONArray в java, он создает массив массивов. Таким образом, я думаю, что исходная строка dataObj уже является массивом, но как мне преобразовать ее для использования в java, чтобы я мог использовать цикл for и т. Д.? – ryandlf

+0

Посмотрите на свой JavaScript. Кажется, у вас есть ошибка, когда вы добавляете объекты в массив. Я не могу сказать вам ничего другого, потому что вы не указали никакого контекста JavaScript. –

+0

В моем javascript я преобразовываю массив объекта в то, что я думаю, является правильным jsonArray, используя stringify. Я проверил, что это проблема, но я не знаю, как ее избежать. До того, как я вызову stringify в массиве в javascript, это отлично работающий массив JS. Должен ли я разбирать его в prep для Java по-другому? – ryandlf

0

Я не совсем уверен, потому что вы не поделились с json, что вы пытаетесь разобрать, но самая вероятная ошибка у вас есть именно то, что она говорит: первый элемент массива - это не JSONObject. Обратите внимание, что строковые значения, lons и boolean не являются JSONObjects. Я бы предложил вам использовать более genereal JSONArray.get и проверить экземпляр того класса. Возможно, это может помочь вам решить проблему с помощью json. Если я ошибаюсь, напишите, и я постараюсь помочь. В таком случае будет полезно поделиться результатами предлагаемого эксперимента.

EDIT: Это двойной массив -> возможно, вы используете getJSONArray (индекс int), который поможет вам. как сказал другой ответ - это массив массивов. Также рассмотрите возможность изменения javascript, чтобы уменьшить уровень включенных массивов.

+0

Get не работает. Я предполагаю, что я каким-то образом строю массив неправильно. Я редактирую вопрос, чтобы включить то, что выглядит json-массив, когда он прошел через javascript. – ryandlf

+0

См. Комментарий выше. Ошибка происходит, когда я конвертирую массив javascript, используя stringify в моем javascript, но я не знаю, как еще преобразовать его в prep для java? – ryandlf

 Смежные вопросы

  • Нет связанных вопросов^_^