2014-10-02 4 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

Trying "[" вместо "{". Следующее исключение:

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) 

Update 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

EDIT

Видя, что вам нужны ключи, как вам требуется строковые значения вам придется использовать комбинацию объектов JSon и массива. Важно помнить, что JSONArray сохранит свой заказ, и JSONObject не будет поддерживать свой заказ (и вы вряд ли сможете это сделать). Я отредактирую приведенный выше код для удобства чтения. Первоначально предполагалось, что в вашем вопросе не будет возможности сохранить свой заказ, поэтому это решение может быть не таким, как вы этого хотите, но, вероятно, ближайший к вам доступ к использованию json. Возможно, вам захочется обернуть разделы в функции и передать список вопросов и ответов в качестве значений, так что вам не нужно многократно повторять весь код, но пока не беспокойтесь об этом. Сначала посмотрите, будет ли это решение работать для ваших нужд.

+0

add() дает ошибку. Возможно, вы имели в виду put()? – definera

+0

ах да извините, немного запутался между arrayList и json. Изменили ответ – Chris

+0

Да, это работает, но, возможно, я не был достаточно ясен. Мне нужен ключ для этих строк. Вы видите эти «1024», «512», «64» и т. Д. Ключ для них должен быть строкой. Идея отверстия заключается в том, что у меня есть вопросы и ответы на каждый вопрос. Как здесь. Если у меня возник вопрос «Каков результат для 2^6», и ответ должен быть одним из этих «1024», «512», «64». – definera

2

Из спецификации JSON в http://www.json.org/

объект представляет собой неупорядоченный набор пар имя/значение

Не беспокоиться о порядке, там не так много вы можете сделать.

+0

Но мне нужно его заказать – definera

+0

Попробуйте @Peter ответьте и сообщите нам, если он сработает. – Distwo

Смежные вопросы