【问题标题】:Java JSONArray from Javascript JSONArray来自 Javascript JSONArray 的 Java JSONArray
【发布时间】:2012-01-13 07:30:28
【问题描述】:

我正在使用 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.

这是从 javascript 传入的 json 数组的样子。这是 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 我无法访问大小或循环遍历它。

【问题讨论】:

    标签: java javascript json gson


    【解决方案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"}]]
    

    【讨论】:

    • 当我在 java 中创建 JSONArray 时,它正在创建数组数组。所以我猜原来的 dataObj 字符串已经是一个数组,但是如何将它转换为在 java 中使用,以便我可以在它上面使用 for 循环等?
    • 看看你的 JavaScript。您似乎有一个错误,您将对象添加到数组中。我不能告诉你其他任何事情,因为你没有提供任何 JavaScript 上下文。
    • 在我的 javascript 中,我正在将一个对象数组转换为我认为使用 stringify 的正确 jsonArray。我确认这是问题所在,但我不知道如何避免它。在我在 javascript 中调用数组上的 stringify 之前,它是一个完美工作的 JS 数组。我应该以不同的方式解析它以准备 Java 吗?
    • 实际上,这是我创建 javascript 数组的方式的错误。我验证了这一点,并且在我字符串化之前发生了双重。您的回答对于告知我最初的问题是正确的,但我会在路上把剩下的数字弄清楚,因为这个问题有点深入。
    【解决方案2】:

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

    编辑: 这是双数组 - >也许你使用 getJSONArray(int index) 会帮助你。正如提到的另一个答案 - 这是数组数组。还可以考虑更改 javascript 以减少包含的数组的级别。

    【讨论】:

    • 获取也不起作用。我假设我以某种方式错误地构建了数组。我正在编辑问题以包含从 javascript 传入时 json 数组的外观。
    • 请看上面的评论。当我在我的 javascript 中使用 stringify 转换 javascript 数组时发生错误,但我不知道如何在 prep for java 中转换它?
    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 2023-03-22
    • 2014-06-09
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多