Загрузка JSON из String в JSONArray на Android

У меня возникли некоторые проблемы в течение некоторого времени, пытаясь загрузить строку JSON в JSONArray. Я надеялся, что сообщение здесь поможет мне решить проблему.

Файл находится в папке с активами и содержит объекты класса Kabelskap. Строка JSON отформатирована следующим образом:

[{"driftsmerking":"1420 10 04","objektnummer":"56569.0","adresse":"KANEBOGÅSEN 4","fabrikat":"NEBB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1420","kommune":"1901 HARSTAD","latitude":"68.7786964342854","longitude":"16.5598512563035"},{"driftsmerking":"4416 01 04","objektnummer":"246349.0","adresse":"NONSÅSEN","fabrikat":"ABB","typebetegnelse":"KO300","spenning":"0.23","posisjon":"OK","kompNr":"4416","kommune":"1911 KVÆFJORD","latitude":"68.7367985627796","longitude":"16.2694481350258"},{"driftsmerking":"4080 05 02","objektnummer":"275933.0","adresse":"KVÆFJORD PLANTESKOLE VEKSTHUS","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"4080","kommune":"1911 KVÆFJORD","latitude":"68.7712454761326","longitude":"16.1901046355049"},{"driftsmerking":"1383 01 02","objektnummer":"150951.0","adresse":"SKILLEVN. 13","fabrikat":"ABB","typebetegnelse":"","spenning":"0.4","posisjon":"OK","kompNr":"1383","kommune":"1901 HARSTAD","latitude":"68.7781436806564","longitude":"16.5643438120601"},{"driftsmerking":"4085 07 02","objektnummer":"275122.0","adresse":"MATHUSET","fabrikat":"NEBB","typebetegnelse":"70","spenning":"0.23","posisjon":"OK","kompNr":"4085","kommune":"1911 KVÆFJORD","latitude":"68.7721426826508","longitude":"16.1785193494225"}] 

Эта строка считывается в переменную String, которая затем передается в этот сегмент кода:

 try { JSONObject jsonObj = new JSONObject(finalString); for(int i = 0; i < json.length(); i++){ Kabelskap ks = (Kabelskap) json.get(i); skap.put(ks.objektnummer, ks); } } catch (JSONException e) { e.printStackTrace(); } 

Это должно, в соответствии с тем, что я ожидал, вернуть массив JSON, который затем я мог бы перебирать и вставлять в объекты моего класса.

 11-30 00:31:33.568: INFO/System.out(389): {"driftsmerking":"1420 10 04","objektnummer":"56569.0","adresse":"KANEBOG SEN 4","fabrikat":"NEBB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1420","kommune":"1901 HARSTAD","latitude":"68.7786964342854","longitude":"16.5598512563035"}{"driftsmerking":"4416 01 04","objektnummer":"246349.0","adresse":"NONS SEN","fabrikat":"ABB","typebetegnelse":"KO300","spenning":"0.23","posisjon":"OK","kompNr":"4416","kommune":"1911 KV FJORD","latitude":"68.7367985627796","longitude":"16.2694481350258"}{"driftsmerking":"4080 05 02","objektnummer":"275933.0","adresse":"KV FJORD PLANTESKOLE VEKSTHUS","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"4080","kommune":"1911 KV FJORD","latitude":"68.7712454761326","longitude":"16.1901046355049"}{"driftsmerking":"1383 01 02","objektnummer":"150951.0","adresse":"SKILLEVN. 13" of type org.json.JSONObject cannot be converted to JSONArray 11-30 00:31:33.588: WARN/System.err(389): at org.json.JSON.typeMismatch(JSON.java:107) 11-30 00:31:33.588: WARN/System.err(389): at org.json.JSONArray.<init>(JSONArray.java:91) 11-30 00:31:33.588: WARN/System.err(389): at org.json.JSONArray.<init>(JSONArray.java:103) 11-30 00:31:33.588: WARN/System.err(389): at net.lovholm.kraftwerk.Kraftwerk.onCreate(Kraftwerk.java:68) 

Это сообщение об ошибке указывает, что проблема с форматированием должна быть проблемой, но для проверки этого я протестировал структуру JSON против некоторых онлайн-валидаторов, и она кажется действительной.

Строка, поскольку она возвращается из журнала, похоже, использует другую кодировку, отличную от файла UTF-8. Я не уверен, может ли это быть частью проблемы или это просто кодировка символов в консоли журнала.

Любое предложение по этой проблеме очень приветствуется.

—- UPDATE —- —- ОБНОВЛЕНИЕ —- —- ОБНОВЛЕНИЕ —- —- ОБНОВЛЕНИЕ —-

Теперь я обновил код с помощью предложений от aj.esler, который исправляет некоторые ошибки, которые я сделал в выдержке кода выше. Вот длинный отрывок из моего кода, и я все еще испытываю проблему с сообщением об ошибке выше. Кажется, эта строка JSONArray json = new JSONArray (finalString); Вызывает что-то злое в конструкторе JSONArray. Переходящая строка должна соответствовать требованиям API с действующим синтаксисом JSON и открывать квадратные скобки.

 try { AssetManager assetManager = getAssets(); fis = assetManager.open(sourcePath); BufferedReader bw = new BufferedReader(new InputStreamReader(fis, "utf8")); while ((str = bw.readLine()) != null){ finalString += str; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println(finalString); try { JSONArray json = new JSONArray(finalString); for(int i = 0; i < json.length(); i++){ JSONObject jsonObj = json.getJSONObject(i); try { Kabelskap ks = getKabelskapFromJSON(jsonObj); skap.put(ks.objektnummer, ks); } catch (JSONException e) { e.printStackTrace(); } } } catch (JSONException e) { e.printStackTrace(); } 

—– ОБНОВЛЕНИЕ 2.0 ——–

System.out.println (finalString)> Не уверен, что читатель или System.out.println () пропускают длинные части текста. Я бы предположил, что DDMS LogCat использует кодировку, не поддерживающую норвежские специальные письма.

 11-30 11:02:27.888: INFO/System.out(4304): {"driftsmerking":"1420 10 04","objektnummer":"56569.0","adresse":"KANEBOG SEN 4","fabrikat":"NEBB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1420","kommune":"1901 HARSTAD","latitude":"68.7786964342854","longitude":"16.5598512563035"}{"driftsmerking":"4416 01 04","objektnummer":"246349.0","adresse":"NONS SEN","fabrikat":"ABB","typebetegnelse":"KO300","spenning":"0.23","posisjon":"OK","kompNr":"4416","kommune":"1911 KV FJORD","latitude":"68.7367985627796","longitude":"16.2694481350258"}{"driftsmerking":"4080 05 02","objektnummer":"275933.0","adresse":"KV FJORD PLANTESKOLE VEKSTHUS","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"4080","kommune":"1911 KV FJORD","latitude":"68.7712454761326","longitude":"16.1901046355049"}{"driftsmerking":"1383 01 02","objektnummer":"150951.0","adresse":"SKILLEVN. 13","fabrikat":"ABB","typebetegnelse":"","spenning":"0.4","posisjon":"OK","kompNr":"1383","kommune":"1901 HARSTAD","latitude":"68.7781436806564","longitude":"16.5643438120601"}{"driftsmerking":"4085 07 02","objektnummer":"275122.0","adresse":"MATHUSET","fabrikat":"NEBB","typebetegnelse":"70","spenning":"0.23","posisjon":"OK","kompNr":"4085","kommune":"1911 KV FJORD","latitude":"68.7721426826508","longitude":"16.1785193494225"}{"driftsmerking":"3410 05 12","objektnummer":"35184.0","adresse":"HANS EGEDESGT. 20 (ERIKSGATE)","fabrikat":"NEBB","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"3410","kommune":"1901 HARSTAD","latitude":"68.7980203542316","longitude":"16.538182961594"}{"driftsmerking":"0800 06 10","objektnummer":"266928.0","adresse":"GAMNES V/MAGNE HARALD OLSEN","fabrikat":"ABB","typebetegnelse":"KO35","spenning":"0.23","posisjon":"OK","kompNr":"","kommune":"1901 HARSTAD","latitude":"68.8206299498345","longitude":"16.4915959572276"}{"driftsmerking":"2580 02 02","objektnummer":"186379.0","adresse":"RESSAN","fabrikat":"ELMEK","typebetegnelse":"50 CM","spenning":"0.23","posisjon":"OK","kompNr":"2580","kommune":"1913 SK NLAND","latitude":"68.6729130202412","longitude":"17.127746958547"}{"driftsmerking":"1500 10 06","objektnummer":"193875.0","adresse":"TUVSLETTVN. 9","fabrikat":"ABB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1500","kommune":"1901 HARSTAD","latitude":"68.74741783798","longitude":"16.5517037722856"}{"driftsmerking":"3282 02 02","objektnummer":"35547.0","adresse":"TEGEB RVN. 12B","fabrikat":"NEBB","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"3282","kommune":"1901 HARSTAD","latitude":"68.7991934883357","longitude":"16.5033927383319"}{"driftsmerking":"1430 05 02","objektnummer":"116375.0","adresse":" VERLAND 2","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"1430","kommune":"1901 HARSTAD","latitude":"68.7759663213591","longitude":"16.5611455110691"}{"driftsmerking":"4150 05 06","objektnummer":"275496.0","adresse":" NYVN. 21","fabrikat":"ABB","typebetegnelse":"KO500","spenning":"0.4","posisjon":"OK","kompNr":"4150","kommune":"1911 KV FJORD","latitude":"68.7741925557284","longitude":"16.1726621696438"}{"driftsmerking":"1486 07 02","objektnummer":"162192.0","adresse":"ROHOLTVN. 7","fabrikat":"ABB","typebetegnelse":"KO 700","spenning":"0.23","posisjon":"OK","kompNr":"1486","kommune":"1901 HARSTAD","latitude":"68.7550368601091","longitude":"16.5679658964195"}{"driftsmerking":"3025 02 06 / 3060 /","objektnummer":"35174.0","adresse":"HANS EGEDESGT. 6 (HVEDINGSGATE)","fabrikat":"NEBB","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"3025","kommune":"1901 HARSTAD","latitude":"68.7994885383443","longitude":"16.5414817371666"}{"driftsmerking":"7045 03 06","objektnummer":"251410.0","adresse":"KONGSVIKDALEN","fabrikat":"","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"7045","kommune":"1852 TJELDSUND","latitude":"68.5682671357777","longitude":"16.2428412985428"}{"driftsmerking":"3010 03 02","objektnummer":"35143.0","adresse":"6.DIVISJONSGT. 10","fabrikat":"ABB","typebetegnelse":"KO500", 

— Новое обновление —

Полная трассировка ошибок из конструктора JSONArray (String json):

 12-03 15:14:44.290: WARN/System.err(412): org.json.JSONException: Value {"posisjon":"OK","spenning":"0.23","driftsmerking":"1420 10 04","adresse":"KANEBOG SEN 4","kompNr":"1420","objektnummer":"56569.0","typebetegnelse":"KO500","longitude":"16.5598512563035","latitude":"68.7786964342854","kommune":"1901 HARSTAD","fabrikat":"NEBB"} of type org.json.JSONObject cannot be converted to JSONArray 12-03 15:14:44.290: WARN/System.err(412): at org.json.JSON.typeMismatch(JSON.java:107) 12-03 15:14:44.290: WARN/System.err(412): at org.json.JSONArray.<init>(JSONArray.java:91) 12-03 15:14:44.290: WARN/System.err(412): at org.json.JSONArray.<init>(JSONArray.java:103) 12-03 15:14:44.290: WARN/System.err(412): at net.lovholm.kraftwerk.Kraftwerk.onCreate(Kraftwerk.java:66) 12-03 15:14:44.290: WARN/System.err(412): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 12-03 15:14:44.290: WARN/System.err(412): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 12-03 15:14:44.290: WARN/System.err(412): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 12-03 15:14:44.290: WARN/System.err(412): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 12-03 15:14:44.290: WARN/System.err(412): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 12-03 15:14:44.290: WARN/System.err(412): at android.os.Handler.dispatchMessage(Handler.java:99) 12-03 15:14:44.290: WARN/System.err(412): at android.os.Looper.loop(Looper.java:130) 12-03 15:14:44.290: WARN/System.err(412): at android.app.ActivityThread.main(ActivityThread.java:3683) 12-03 15:14:44.290: WARN/System.err(412): at java.lang.reflect.Method.invokeNative(Native Method) 12-03 15:14:44.290: WARN/System.err(412): at java.lang.reflect.Method.invoke(Method.java:507) 12-03 15:14:44.290: WARN/System.err(412): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 12-03 15:14:44.290: WARN/System.err(412): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 12-03 15:14:44.290: WARN/System.err(412): at dalvik.system.NativeStart.main(Native Method) 

Реализация инициализации JSONArray и метода getKabelskapfromJSON:

  1. Вывод инициализации массива JSON

    Try {JSONArray json = новый JSONArray (finalString);

     for(int i = 0; i < json.length(); i++){ JSONObject jsonObj = json.getJSONObject(i); try { Kabelskap ks = getKabelskapFromJSON(jsonObj); skap.put(ks.objektnummer, ks); } catch (JSONException e) { e.printStackTrace(); } } 

    } Catch (JSONException e) {e.printStackTrace (); }

  2. Метод getKabelselskapFromJSON:

    Private Kabelskap getKabelskapFromJSON (JSONObject jsonObj) бросает JSONException {

     String driftsmerking = jsonObj.getString("driftsmerking"); String adresse = jsonObj.getString("addresse"); String objektnummer = jsonObj.getString("objektnummer"); String spenning = jsonObj.getString("spenning"); String fabrikat = jsonObj.getString("fabrikat"); String typebetegnelse = jsonObj.getString("typebetegnelse"); String posisjon = jsonObj.getString("posisjon"); String kompNr = jsonObj.getString("kompNr"); String kommune = jsonObj.getString("kommune"); String latitude = jsonObj.getString("latitude"); String longitude = jsonObj.getString("longitude"); Kabelskap k = new Kabelskap(driftsmerking, objektnummer, adresse, fabrikat, typebetegnelse, spenning, posisjon, kompNr, kommune, latitude, longitude); return k; 

}

Solutions Collecting From Web of "Загрузка JSON из String в JSONArray на Android"

Несколько проблем, которые я вижу:

  1. Вы используете jsonObj в первой строке, которая является JSONObject. Затем в цикле for вы используете другой объект с именем json. Я собираюсь предположить, что эти два являются одним и тем же объектом. В противном случае в вашем примере отсутствует информация.
  2. JSONObject не имеет метода get, который принимает целое число. Есть один, который берет строку, поэтому я предполагаю, что вы имели в виду это.
  3. JSONObject.get возвращает данные, соответствующие ключу, который вы ему даете. Он возвращает объект.

Ошибка, которую вы получаете, заключается в том, что вы пытаетесь включить JSONObject в Kabelskap.

То, что я сделал бы, это создать вспомогательный метод, как показано ниже. Кроме того, вы можете создать специальный конструктор объекта Kabelstap.

 public Kabelskap getKabelskapFromJSON(JSONObject jsonObj) { Kabelskap k = new Kabelskap(); String driftsmerking = jsonObj.getString("driftsmerking"); k.setDriftsmerking(driftsmerking); String addresse = jsonObj.getString("addresse"); k.setAddresse(addresse); String objektnummer = jsonObj.getString("objektnummer"); k.setObjektNummer(objektnummer); double spenning = jsonObj.getDouble("spenning"); k.setSpenning(spenning); // ... and so on for each property. return k; } 

Который затем можно использовать так:

 try { JSONArray jsonArray = new JSONArray(yourJSONString); for(int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObj = jsonArray.getJSONObject(i); Kabelskap k = getKabelskapFromJSON(jsonObj); // do something with k. eg System.out.println("Kabelskap@"+i+": "+k); } } catch (JSONException e) { e.printStackTrace(); } 

Документация для JSONObject находится здесь, и JSONArray здесь .

Две вещи,

  1. При анализе данных вы должны использовать JSONArray .
  2. Вам нужно разобрать json и создать объекты Kabelskap самостоятельно. Json.get (i) вернет Object , который в этом случае будет JSONObject . С помощью этого JSONObject вы затем используете геттеры для получения полей и создания своего объекта Kabelskap.