J'ai un objet HttpResponse pour une requête Web que je viens de faire. La réponse est au format JSON, je dois donc l’analyser. Je peux le faire d'une manière absurdement complexe, mais il me semble qu'il doit y avoir un meilleur moyen.
Est-ce vraiment le mieux que je puisse faire?
HttpResponse response; // some response object
Reader in = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder= new StringBuilder();
char[] buf = new char[1000];
int l = 0;
while (l >= 0) {
builder.append(buf, 0, l);
l = in.read(buf);
}
JSONTokener tokener = new JSONTokener( builder.toString() );
JSONArray finalResult = new JSONArray( tokener );
Je suis sur Android si cela fait une différence.
Deux choses qui peuvent être faites plus efficacement:
StringBuilder
au lieu de StringBuffer
car c'est le frère le plus rapide et le plus jeune.BufferedReader#readLine()
pour le lire ligne par ligne au lieu de le lire caractère par caractère.HttpResponse response; // some response object
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String line = null; (line = reader.readLine()) != null;) {
builder.append(line).append("\n");
}
JSONTokener tokener = new JSONTokener(builder.toString());
JSONArray finalResult = new JSONArray(tokener);
Si le JSON est en réalité une seule ligne, vous pouvez également supprimer la boucle et le générateur.
HttpResponse response; // some response object
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String json = reader.readLine();
JSONTokener tokener = new JSONTokener(json);
JSONArray finalResult = new JSONArray(tokener);
Utilisez JSON Simple,
http://code.google.com/p/json-simple/
Qui a une petite empreinte, pas de dépendances, donc parfait pour Android.
Vous pouvez faire quelque chose comme ça,
Object obj=JSONValue.parse(buffer.tString());
JSONArray finalResult=(JSONArray)obj;
Vous pouvez utiliser la bibliothèque Gson pour analyser
void getJson() throws IOException {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("some url of json");
HttpResponse httpResponse = httpClient.execute(httpGet);
String response = EntityUtils.toString(httpResponse.getEntity());
Gson gson = new Gson();
MyClass myClassObj = gson.fromJson(response, MyClass.class);
}
voici un exemple de fichier json qui est fetchd du serveur
{
"id":5,
"name":"KitKat",
"version":"4.4"
}
voici ma classe
class MyClass{
int id;
String name;
String version;
}
se référer this
Jackson semble prendre en charge une partie de l'analyse JSON directement à partir d'un InputStream
. Si j'ai bien compris, il fonctionne sous Android et est assez rapide. Par contre, il s'agit d'un fichier JAR supplémentaire à inclure dans votre application, ce qui augmente le téléchargement et la taille de la mémoire flash.
Pour Android, et en utilisant la bibliothèque Commons IO pour IOUtils
:
// connection is a HttpURLConnection
InputStream inputStream = connection.getInputStream()
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(inputStream, baos);
JSONObject jsonObject = new JSONObject(baos.toString()); // JSONObject is part of Android library
Au lieu de faire
Reader in = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder= new StringBuilder();
char[] buf = new char[1000];
int l = 0;
while (l >= 0) {
builder.append(buf, 0, l);
l = in.read(buf);
}
JSONTokener tokener = new JSONTokener( builder.toString() );
Tu peux faire:
JSONTokener tokener = new JSONTokener(
IOUtils.toString(response.getEntity().getContent()) );
où IOUtils est issu de la bibliothèque de communes IO.