2012-01-13 9 views
2

jsonオブジェクトをjavascriptからajaxを使用してJavaサーブレットに渡しています。私のJavaではJava JSONArray from Javascript JSONArray

var jsonObj = JSON.stringify(objArray); //Then I pass it to Java using ajax. 

私は、その配列をループして、アレイからJSONオブジェクトの1を引くしようとしたとき、私はエラーを取得しています、そして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から渡されたときの外観です。これはjsonArrayオブジェクトのprintlnです。

[{"number":"(123) 456-7050","type":"Home","contactId":1,"id":16662,"className":"beans.PhoneNumber","position":0}] 

このコードは1つのオブジェクトで動作します。しかし、私は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だけを使用すると、サイズにアクセスすることができず、ループすることもありません。

答えて

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 
     } 
    ] 
] 

これはオブジェクトの配列ではありません。これはオブジェクトの配列の配列です。

[{"foo":"bar"}, {"bar":"baz"}] 

しかし、あなたは本当に解析しようとしている:

[[{"foo":"bar"}, {"bar":"baz"}]] 
+0

JSONArrayをJavaで作成すると、配列の配列が作成されます。だから元のdataObj文字列はすでに配列ですが、私はそれをforループなどを使用することができるようにjavaで使用するために変換するにはどうすればよいですか? – ryandlf

+0

JavaScriptをご覧ください。配列にオブジェクトを追加するバグがあるようです。あなたはJavaScriptの文脈を提供していないので、私は何も教えてくれません。 –

+0

私のjavascriptでは、私はstringifiedを使って適切なjsonArrayを考えているオブジェクトの配列を変換しています。これが問題であることを確認しましたが、回避する方法はわかりません。私はjavascriptで配列のstringifyを呼び出す前に、それは完全に動作するJS配列です。私はそれをJavaの準備のために別の方法で解析する必要がありますか? – ryandlf

0

あなたが解析しようとしているJSONを共有していないので、私は完全にはわかりませんが、考えられるエラーはJSONObjectではありません。文字列の値、lonsおよびbooleanはJSONObjectではありません。より一般的なJSONArray.getを使用し、それがどのクラスであるかを確認することをお勧めします。たぶんこれはあなたが持っているjsonの問題にあなたを導くことができます。もし私がそれを完全に間違ってしまったら、書き返してください。私は助けようとします。このような場合、提案された実験の結果を共有することは依然として有効です。

EDIT: これは二重配列です - >たぶんgetJSONArray(int index)を使用すると役立ちます。他の答えとして - これは配列の配列です。また、含まれる配列のレベルを下げるためにjavascriptを変更することを検討してください。

+0

取得はどちらか動作しませんあなたの説明によると、次のようにJavaに供給されるようなものを期待しています。私は何とか間違って配列を構築していると仮定しています。私はjson配列がjavascriptから渡されたときのようなものを含めるように質問を編集しています。 – ryandlf

+0

上記のコメントをご覧ください。私のjavascriptでstringifyを使用してjavascript配列を変換すると、エラーが発生していますが、javaのprepで変換する方法がわかりません。 – ryandlf