来自Javascript JSONArray的Java JSONArray

时间:2012-01-13 07:30:28

标签: java javascript json gson

我使用ajax将json对象从javascript传递给java servlet。

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,我无法访问大小或循环访问它。

2 个答案:

答案 0 :(得分: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"}]]

答案 1 :(得分:0)

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

修改: 这是双数组 - &gt;也许你使用getJSONArray(int index)会帮助你。正如提到的另一个答案 - 这是数组的数组。另外,请考虑更改javascript以降低包含的数组级别。