Chargement de JSON à partir d'une Chaîne en JSONArray sur Android
J'ai connu quelques problèmes pour un certain temps à essayer de charger une chaîne JSON dans un JSONArray. J'espérais un post ici pourrait m'aider à résoudre le problème.
Le fichier se trouve dans le dossier des actifs et contiennent des objets de la classe Kabelskap. La chaîne JSON est formaté comme cet extrait:
[{"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"}]
Cette chaîne est lue dans une variable de Chaîne qui est ensuite passé dans ce segment de code:
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();
}
Ce qui devrait, d'après ce que j'attendais, retourne un tableau JSON que j'ai pu parcourir et jeté dans les objets de ma classe.
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)
Ce message d'erreur indique qu'il doit y avoir un problème avec la mise en forme, mais pour vérifier cela, j'ai testé la structure JSON à l'encontre de certains validateurs en ligne et il semble être valide.
La Chaîne comme il est renvoyé du journal semble utiliser un encodage différent de celui du fichier en UTF-8. Je ne suis pas sûr de savoir si cela peut être une partie du problème ou si c'est juste l'encodage des caractères de la console de log.
Toute suggestion tendant à ce problème est la bienvenue.
---- MISE À JOUR ---- ---- MISE À JOUR ---- ---- MISE À JOUR ---- ---- MISE À JOUR ----
J'ai maintenant mis à jour le code avec les suggestions de l'aj.esler, qui corrige certaines erreurs que j'ai fait dans l'extrait de code ci-dessus. Voici un long extrait de mon code, et je ressens toujours des problème avec le message d'erreur ci-dessus. Il semble que cette ligne
JSONArray json = new JSONArray(finalString);
cause de quelque chose de malveillant à se produire dans le JSONArray constructeur. La Chaîne de caractères passée dans devrait accueillir les exigences de l'API JSON valide la syntaxe et de l'ouverture des crochets.
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();
}
----- Mise à JOUR 2.0 --------
La System.out.println(finalString)
> Pas sûr que le lecteur ou l' System.out.println()
saute long des parties du texte. Je présume que les DDMS LogCat est à l'aide d'un jeu de caractères ne pas soutenir norvégien des lettres spéciales.
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",
-- Nouvelle mise à jour --
L'erreur totale de trace de la JSONArray(String json) constructeur:
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)
La mise en œuvre de la JSONArray de l'initialisation et de la getKabelskapfromJSON
méthode:
-
Tableau JSON initialisation extrait
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(); }
-
getKabelselskapFromJSON méthode:
privé Kabelskap getKabelskapFromJSON(JSONObject jsonObj) throws 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;
}
OriginalL'auteur olovholm | 2011-11-29
Vous devez vous connecter pour publier un commentaire.
Quelques problèmes que je peux voir:
L'erreur que vous obtenez est parce que vous êtes en train de jeter un JSONObject à un Kabelskap.
Ce que je voudrais faire est de créer une méthode d'assistance comme ci-dessous. Sinon, vous pouvez créer un constructeur sur le Kabelstap objet.
qui peut ensuite être utilisé comme:
Documentation pour JSONObject est ici et JSONArray est ici.
Je n'ai pas rencontré la même erreur que moi-même. Dans votre mise à jour, vous avez la ligne "Système..println(finalString);". Pourriez-vous poster une mise à jour avec le résultat de l'exécution de ce alors la résultante trace de l'erreur. De sorte que le json que vous essayez d'analyser, puis de l'erreur.
Je vous remercie pour votre aide. J'ai maintenant mis à jour le post avec les parties de la trace de l'erreur et le résultat du Système..println(). J'ai également écrit quelques questions et commentaires.
pourriez-vous poster le plein de trace de pile, et le code de la getKabelskapFromJSON méthode si son dans le plein stacktrace.
Salut, merci pour l'aide pour l'instant. J'ai mis à jour avec des informations un peu plus maintenant.
OriginalL'auteur aj.esler
Deux choses,
JSONArray
lors de l'analyse des données.Object
, qui dans ce cas seraJSONObject
. Avec quiJSONObject
vous pouvez ensuite utiliser les accesseurs pour obtenir les champs et créer votre Kabelskap objet.OriginalL'auteur brianestey