Java JSONArray из Javascript JSONArray - PullRequest
       6

Java JSONArray из Javascript JSONArray

2 голосов
/ 13 января 2012

Я передаю объект json из javascript в java-сервлет, используя ajax.

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.

[{"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, у меня нет доступа к размеру или циклу.

Ответы [ 2 ]

1 голос
/ 13 января 2012
    [
    [
        {
            "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 голосов
/ 13 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...