Comment analyser un tableau JSON (pas un objet Json) dans Android


89

J'ai du mal à trouver un moyen d'analyser JSONArray. Cela ressemble à ceci:

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

Je sais comment l'analyser si le JSON a été écrit différemment (en d'autres termes, si j'ai renvoyé un objet json au lieu d'un tableau d'objets). Mais c'est tout ce que j'ai et je dois l'accompagner.

* EDIT: C'est un json valide. J'ai créé une application iPhone en utilisant ce json, maintenant je dois le faire pour Android et je ne peux pas le comprendre. Il existe de nombreux exemples, mais ils sont tous liés à JSONObject. J'ai besoin de quelque chose pour JSONArray.

Quelqu'un peut-il me donner un indice, un tutoriel ou un exemple?

Très appréciée !


1
Essayez ceci pour voir si votre json est valide json.parser.online.fr
An-droid

utilisez-vous une bibliothèque pour analyser json? Utilisez la bibliothèque gson pour l'analyse json.
nilkash

C'est valable. Je l'ai analysé dans une application que j'ai faite pour un iPhone et cela fonctionne. Je ne sais tout simplement pas comment le faire sous Android
SteBra

1
@nikash, ouais, j'ai remarqué que je pourrais utiliser gson. le seul problème est que tous les exemples que j'ai trouvés sont pour analyser un JSONObject et non JSONArray
SteBra

Postez votre code que vous avez essayé jusqu'à présent, il sera utile de donner une réponse précise en conséquence.
Spring Breaker

Réponses:


144

utilisez l'extrait de code suivant pour analyser le JsonArray.

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

J'espère que ça aide.


juste une question si jsonarray inclut des nombres comme [2]. [4] et que les chiffres à l'intérieur incluent à nouveau un tableau, donc si je veux récupérer de, disons surtout le tableau imbriqué dans numeric [4] dans le code java, je dois écrire int i = 4 ???
BiggDawgg

@BiggDawgg: Heureux que cela vous ait aidé. Postez votre question dans un fil de discussion séparé avec des données JSON afin qu'il me soit facile de répondre.
Spring Breaker

26

Je vais juste donner un petit exemple de Jackson :

Créez d'abord une zone de stockage de données contenant les champs de la chaîne JSON

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

Et analyser la liste de MyDataHolders

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

Utilisation des éléments de liste

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;

Pouvez-vous me donner un exemple comment obtenir JSON sous forme de chaîne à partir de l'URL que j'ai, s'il vous plaît?
SteBra

1
La DefaultHttpClientméthode d'exécution s est un appel bloquant, elle doit donc être effectuée dans une tâche d'arrière-plan, juste pour expliquer pourquoi elle est dans une classe séparée.
vilpe89

Je reçois une erreur sur le constructeur de HttpGetTask. «Le constructeur HttpGetTask (OnHttpGetCompletedListener) fait référence au type manquant OnHttpGetCompletedListener»
SteBra

1
avez-vous importé OnHttpGetCompletedListener? Comme çaimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Oui, c'était le problème ... Merci d'avoir résolu mon problème :)
SteBra

19
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

Production:

name1
url1
name2
url2

12

Créez une classe pour contenir les objets.

public class Person{
   private String name;
   private String url;
   //Get & Set methods for each field
}

Désérialisez ensuite comme suit:

Gson gson = new Gson();
Person[] person = gson.fromJson(input, Person[].class); //input is your String

Article de référence: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Je suppose que cette "entrée" serait l'URL de ce json? Ou s'agit-il d'autre chose?
SteBra

C'est une solution très simple. Cela devrait être l'acceptation à mon avis
FabioC

6

@Stebra Voir cet exemple. Cela peut vous aider.

public class CustomerInfo 
{   
    @SerializedName("customerid")
    public String customerid;
    @SerializedName("picture")
    public String picture;

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

Et quand vous obtenez le résultat; analyser comme ça

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());

1
La variable de résultat est votre chaîne
JSONArray

La variable de résultat serait-elle l'URL dont j'ai besoin pour récupérer json ou déjà extraite json?
SteBra

de loin la solution la plus simple
0x6C38

6

Dans cet exemple, il y a plusieurs objets dans un même tableau json. C'est,

Voici le tableau json: [{"name": "name1", "url": "url1"}, {"name": "name2", "url": "url2"}, ...]

Ceci est un objet: {"name": "name1", "url": "url1"}

En supposant que vous avez obtenu le résultat dans une variable String appelée jSonResultString:

JSONArray arr = new JSONArray(jSonResultString);

  //loop through each object
  for (int i=0; i<arr.length(); i++){

  JSONObject jsonProductObject = arr.getJSONObject(i);
  String name = jsonProductObject.getString("name");
  String url = jsonProductObject.getString("url");


}

J'ai du mal à obtenir ma chaîne JSON à partir de l'URL. Peut-être pourriez-vous aider avec ça?
SteBra

Merci de le décomposer avec des exemples, bonne clarté
ryvianstyron

3

Quelques bonnes suggestions sont déjà mentionnées. Utiliser GSON est vraiment très pratique, et pour rendre la vie encore plus facile, vous pouvez essayer ce site Web qui s'appelle jsonschema2pojo et fait exactement cela:

Vous lui donnez votre json et il génère un objet java qui peut coller dans votre projet. Vous pouvez sélectionner GSON pour annoter vos variables, donc extraire l'objet de votre json devient encore plus facile!


2

Mon cas Exemple de chargement depuis le serveur.

int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
            if (jsonLength != 1) {
                for (int i = 0; i < jsonLength; i++) {
                    JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                    JSONObject resJson = (JSONObject) jsonArray.get(i);
                    //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                }

J'espère que ça aide


ps "jsonObject.getString (" messages ")" type est jsonArray; la première réponse existe est impossible de convertir la chaîne en jsonArray; je le répare.
최봉재

-1

Créez une classe Java POJO pour les objets de la liste comme ceci:

class NameUrlClass{
       private String name;
       private String url;
       //Constructor
       public NameUrlClass(String name,String url){
              this.name = name;
              this.url = url; 
        }
}

Maintenant, créez simplement une liste de NameUrlClass et initialisez-la à une ArrayList comme ceci:

List<NameUrlClass> obj = new ArrayList<NameUrlClass>;

Vous pouvez utiliser stocker le tableau JSON dans cet objet

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]

1
Ce qui obj = JSONArray;est censé faire n'est pas clair . Qu'est- JSONArrayce que dans ce contexte? D'où est ce que ça vient? Quel est le but de l'initialisation objavec a new ArrayList<NameUrlClass>, quand vous le remplacez directement après de toute façon?
Max Vollmer

-3

Ancien message que je connais, mais à moins d'avoir mal compris la question, cela devrait faire l'affaire:

s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
eval("array=" + s);
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
    alert(array[i][index]);
}

}


-3
            URL url = new URL("your URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            //setting the json string
            String finalJson = buffer.toString();

            //this is your string get the pattern from buffer.
            JSONArray jsonarray = new JSONArray(finalJson);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.