我使用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,我无法访问大小或循环访问它。
答案 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以降低包含的数组级别。