Parsen von json direkt mit input-stream
Bin ich dabei eine api-Aufruf, und in der Antwort, die ich bin immer json. Also für das, dass ich möchte, um zu analysieren es direkt durch input-Streams, so dass es keine Notwendigkeit, es zu speichern in den Speicher.
Dafür bin ich zu verwenden versucht JSONReader aber ich bin nicht in der Lage verwenden Sie für die api weniger als 11.
Also ich weiß nicht, wie gehen Sie mit. Ich will, dass es getan werden, von der version 2.0 an. Auch das Parsen durch JsonReader nicht funktioniert.
Ich war die Sache mit GSON-parser, aber ich bin nicht immer so zu implementieren das gleiche mit Inputstream.
BEARBEITEN:
Mein code für die gleiche:
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
Log.e("123", "Status code ----------- "+statusCode);
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
//for showing it on textview i am storing in in builder
BufferedReader bReader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = bReader.readLine()) != null) {
builder.append(line);
}
////////////
JsonReader reader = new JsonReader(new InputStreamReader(content));
reader.setLenient(true);
readGson(reader);
} else {
Log.e("TAG", "Failed to download file");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return builder.toString();
}
private void readGson(JsonReader reader) {
//TODO Auto-generated method stub
Log.e("TAG", "inidde readgson"+reader);
try {
Log.e("TAG", "inside try");
reader.beginObject();
Log.e("123", "inside try ");
while(reader.hasNext()){
Log.e("TAG", "reader values"+reader);
String name = reader.nextName();
if (name.equals("max_id")) {
long max_id = reader.nextLong();
Log.e("TAG", "sdbfhsajfgsdjbgksdfjv------------------"+max_id);
} else {
Log.e("TAG", "c skfnvklsfvn skip value");
reader.skipValue();
}
}
reader.endObject();
} catch (IOException e) {
//TODO Auto-generated catch block
Log.e("TAG", "inside catch");
e.printStackTrace();
}
}
Ausgabe:
01-28 10:20:53.519: E/TAG(420): Status code ----------- 200
01-28 10:20:53.679: E/TAG(420): inidde readgsonJsonReader at line 1 column 1
01-28 10:20:53.679: E/TAG(420): inside try
01-28 10:20:53.679: E/TAG(420): inside catch
01-28 10:20:53.679: W/System.err(420): java.io.EOFException: End of input at line 1 column 1
01-28 10:20:53.689: W/System.err(420): at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:954)
01-28 10:20:53.689: W/System.err(420): at com.google.gson.stream.JsonReader.consumeNonExecutePrefix(JsonReader.java:405)
01-28 10:20:53.689: W/System.err(420): at com.google.gson.stream.JsonReader.peek(JsonReader.java:364)
01-28 10:20:53.689: W/System.err(420): at com.google.gson.stream.JsonReader.expect(JsonReader.java:337)
01-28 10:20:53.689: W/System.err(420): at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:322)
01-28 10:20:53.689: W/System.err(420): at com.example.httpconnectiondemo.MainActivity.readGson(MainActivity.java:136)
01-28 10:20:53.699: W/System.err(420): at com.example.httpconnectiondemo.MainActivity.readTwitterFeed(MainActivity.java:116)
01-28 10:20:53.699: W/System.err(420): at com.example.httpconnectiondemo.MainActivity.onCreate(MainActivity.java:64)
01-28 10:20:53.699: W/System.err(420): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-28 10:20:53.699: W/System.err(420): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
01-28 10:20:53.699: W/System.err(420): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
01-28 10:20:53.699: W/System.err(420): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-28 10:20:53.699: W/System.err(420): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-28 10:20:53.699: W/System.err(420): at android.os.Handler.dispatchMessage(Handler.java:99)
01-28 10:20:53.699: W/System.err(420): at android.os.Looper.loop(Looper.java:123)
01-28 10:20:53.699: W/System.err(420): at android.app.ActivityThread.main(ActivityThread.java:3683)
01-28 10:20:53.710: W/System.err(420): at java.lang.reflect.Method.invokeNative(Native Method)
01-28 10:20:53.710: W/System.err(420): at java.lang.reflect.Method.invoke(Method.java:507)
01-28 10:20:53.710: W/System.err(420): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-28 10:20:53.710: W/System.err(420): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-28 10:20:53.710: W/System.err(420): at dalvik.system.NativeStart.main(Native Method)
Vielen Dank im Voraus.
InformationsquelleAutor Vaibs | 2013-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bist du mit dem
content
stream in einen falschen Weg. Schauen Sie an den markierten Linien:Das Problem hier ist, dass Sie wickeln den selben Strom zweimal (an markierten Linie).
builder
. Sie müssen sich bewusst sein, dass effektiv diebReader
ist nur ein wrapper um diecontent
stream. So, während Sie erfassen die Zeilen, die Inhalte aus dercontent
stream ist gegessen. Also, die Bedingung(line = ...) != null
istfalse
wenn diecontent
stream ist am Ende der Eingabe.content
stream wieder - zum Parsen von JSON-Inhalten. Aber der stream ist bereits am Ende der Eingabe hier, so gibt es nichts zu konsumieren von JSON-reader. Und das genau ist der Sinn der Zeile:java.io.EOFException: End of input at line 1 column 1
Ihre Ausnahme.Was Sie zu tun haben ist zu Lesen, durch die
content
stream nur einmal. Also, haben Sie mehrere Möglichkeiten hier:String
. Löschen Sie das erste wickeln und die Schleife, die baut der Antwort-string mit einembuilder
. Wenn das keine option ist, dann empfehle ich:Speichern Sie die gesamte Antwort auf eine
String
. Hinweis: Sie können dieEntityUtils
Klasse, denn es wird die Arbeit für Sie tun:Nette Antwort, dude. Es war sehr klärend, sondern etwas, das wirklich mich verwirrt: warum haben Sie Beratung zu dont save etwas Schnur ( was ich als ein gutes software-design nach Wahl ) und auf das nächste Thema Sie Beratung zu speichern, die gesamte Antwort auf eine Zeichenfolge.
du hast Recht, danke für den Hinweis, ist geändert 🙂 lassen Sie mich erklären, was ich meinte. mein Rat, keine hält den Inhalt der Antwort in einem
String
kommt aus meiner Erfahrung mit Android-Geräten - einige von Ihnen sind ziemlich low-memory-limits, z.B. 16M/Anwendung. nun stellen Sie sich eine Anwendung, die versucht, das speichern von JSON-Antwort, die hat, sagen wir mal, 20M... würde die Anwendung stürzt einfach ab. Ich weiß nicht, was OP-Geräte ausgerichtet ist, und das ist, warum ich schrieb, dass 1. Punkt. es gibt jedoch Fälle, in denen Sie wissen, dieses Szenario wird nicht passieren und Sie können sicher gehen, mit dem 2. Punkt.perfekt! Danke Ihnen so sehr für die Klarstellung.
InformationsquelleAutor andr