2014-10-02 70 views
0

我有以下字符串JSON代码:的Android的JSONObject洗牌

json = new JSONObject(
         "{\"Questions\":{" 
         + "\"1\":[\"ELSYS\",\"ELSYS2\",\"ELSYS3\",\"ELSYS4\"]," 
         + "\"2\":[\"1024\",\"2048\",\"512\",\"64\"]," 
         + "\"3\":[\"RANDOM1\",\"RANDOM2\",\"RANDOM3\",\"RANDOM4\"]," 
         + "\"4\":[\"A DOG1\",\"A DOG2\",\"A DOG3\",\"A DOG4\"]," 
         + "\"5\":[\"SOME WORD1\",\"SOME WORD2\",\"SOME WORD3\",\"SOME WORD4\"]}}"); 

正确初始化后,我打印JSON的logcat的:

Log.i(TAG, json.toString()); 

我的问题是,JSON啮合起来。这是输出:

{"Questions":{"3":["RANDOM1","RANDOM2","RANDOM3","RANDOM4"],"2":["1024","2048","512","64"],"1":["ELSYS","ELSYS2","ELSYS3","ELSYS4"],"5":["SOME WORD1","SOME WORD2","SOME WORD3","SOME WORD4"],"4":["A DOG1","A DOG2","A DOG3","A DOG4"]}} 

而且更可读这里是从JSON解析信息:

key => 3 || value => RANDOM1,RANDOM2,RANDOM3,RANDOM4 
key => 2 || value => 1024,2048,512,64 
key => 1 || value => ELSYS,ELSYS2,ELSYS3,ELSYS4 
key => 5 || value => SOME WORD1,SOME WORD2,SOME WORD3,SOME WORD4 
key => 4 || value => A DOG1,A DOG2,A DOG3,A DOG4 

正如你所看到的字符串是不正确的顺序。我在普通的Java程序中尝试了相同的代码,并且它正常工作。我在android中这样做的问题在那里。你知道可能是什么问题吗? (我试图清理项目),而不是 “{”

UPDATE

尝试 “[”。以下异常被抛出:

10-02 18:49:09.985: W/System.err(2263): org.json.JSONException: Unterminated array at character 18 of {"Questions":["1":["ELSYS","ELSYS2","ELSYS3","ELSYS4"],"2":["1024","2048","512","64"],"3":["RANDOM1","RANDOM2","RANDOM3","RANDOM4"],"4":["A DOG1","A DOG2","A DOG3","A DOG4"],"5":["SOME WORD1","SOME WORD2","SOME WORD3","SOME WORD4"]]} 
10-02 18:49:09.985: W/System.err(2263):  at org.json.JSONTokener.syntaxError(JSONTokener.java:450) 
10-02 18:49:09.985: W/System.err(2263):  at org.json.JSONTokener.readArray(JSONTokener.java:440) 
10-02 18:49:09.985: W/System.err(2263):  at org.json.JSONTokener.nextValue(JSONTokener.java:103) 
10-02 18:49:09.985: W/System.err(2263):  at org.json.JSONTokener.readObject(JSONTokener.java:385) 
10-02 18:49:09.985: W/System.err(2263):  at org.json.JSONTokener.nextValue(JSONTokener.java:100) 
10-02 18:49:09.985: W/System.err(2263):  at org.json.JSONObject.<init>(JSONObject.java:154) 
10-02 18:49:09.985: W/System.err(2263):  at org.json.JSONObject.<init>(JSONObject.java:171) 
10-02 18:49:09.985: W/System.err(2263):  at com.tarasoft.shop.HTTPRequests$SendRequest.doInBackground(HTTPRequests.java:36) 
10-02 18:49:09.985: W/System.err(2263):  at com.tarasoft.shop.HTTPRequests$SendRequest.doInBackground(HTTPRequests.java:1) 
10-02 18:49:09.985: W/System.err(2263):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
10-02 18:49:09.985: W/System.err(2263):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
10-02 18:49:09.985: W/System.err(2263):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
10-02 18:49:09.985: W/System.err(2263):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
10-02 18:49:09.985: W/System.err(2263):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
10-02 18:49:09.985: W/System.err(2263):  at java.lang.Thread.run(Thread.java:856) 

更新2 你应该知道,这些键“1”,“2”等,也可以是字符串太多,所以我不使用它们来排序的JSON,我使用唯一的来查看订单是否正确。将不会有这些“1”,“2”等字符串。

回答

1

JSONArray是有序的,可以包含集合作为值,也就是其他jsonArrays。使问题一部分的jsonArray,然后把它放在里面的JSONObject像这样:

JSONArray questionsArray = new JSONArray(); 

JSONArray one = new JSONArray(); 
one.put("ELSYS") 
one.put("ELSYS2") 
one.put("ELSYS3") 
one.put("ELSYS4") 
JSONObject firstObject = new JSONObject() 
firstObject.put("question", "6*2")//(key, value) 
firstObject.put("answers", one) 
questionsArray.put(firstObject) 

JSONArray two = new JSONArray(); 
two.put("1024") 
two.put("2048") 
two.put("512") 
two.put("64") 
JSONObject secondObject = new JSONObject() 
secondObject.put("question", "hello world?") 
secondObject.put("answers", two) 
questionsArray.put(secondObject) 

//do this for all your items then add the questions array to your jsonObject 
JSONObject mainJsonObj = new JSONObject() 
mainJsonObj.put("questions", questionsArray); 

//then when you need the data you will go like this: 
questionsArray = mainJsonObj.optJSONArray("questions") 

//then you have your ordered array containing your question/answer objects, the answers of which will be ordered. To get them you will have to get by index like: 
objOne = questionsArray.get(0) //etc 
String question = objOne.optString("question") 
JSONArray answers = objOne.optString("answers") 

东西沿着这些线路,你可以尝试使它有点更优雅,这只是证明的基本思想。或者你将不得不看像的LinkedHashMap/ArrayList的

编辑

看到你所需要的按键,你需要你将不得不使用JSON对象和数组的组合的字符串值不同的数据结构。重要的是要记住的是,这个JSONArray将保持其顺序,并且JSONObject不会维护它的顺序(并且你可以做很多事情)。为了便于阅读,我将编辑上述代码。最初在你的问题中设想它的方式不可能维持它的顺序,所以这个解决方案可能并不完全像你想要的那样,但它可能是最接近你将不幸使用json的。您可能想要将这些部分封装在函数中,并将问题和答案列表作为值传递,这样您就不需要重复所有代码,但现在不用担心。首先看看这个解决方案是否能满足您的需求。

+0

add()给出错误。你的意思是put()? – definera 2014-10-02 19:48:24

+0

啊对不起,在arrayList和json之间有点混淆。已编辑答案 – Chris 2014-10-02 19:53:13

+0

是的,这有效,但也许我不够清楚。我需要这些字符串的密钥。你会看到这些“1024”,“512”,“64”等。他们的关键应该是一个字符串。洞的想法是,我对每个问题都有疑问和可能的答案。像这儿。如果我有这样的问题:“2^6的结果是什么”,答案应该是这些“1024”,“512”,“64”中的一个。 – definera 2014-10-02 20:04:06

2

从JSON规范在http://www.json.org/

的对象是一个无序的名称/值对

不要担心秩序的,有没有什么可以做的。

+0

但我需要它订购它 – definera 2014-10-02 18:40:58

+0

尝试@Peter的答案,让我们知道它是否有效。 – Distwo 2014-10-02 18:41:39