web-dev-qa-db-fra.com

Analyser les données JSON avec JSONReader ou JSONObject/JSONArray

J'ai du JSON (voir ci-dessous), j'essaie d'analyser l'intégralité du JSON et chaque objet sera une nouvelle instance d'une classe qui déclare les variables ci-dessous. Quelle est la meilleure façon de procéder? Devrais-je utiliser un JSONReader ou utiliser JSONObject et JSONArray. J'ai lu des tutoriels et posé des questions d'ordre général, mais je n'ai jamais vu d'exemples sur la manière d'analyser des données comme celle-ci.

{
    "id": 356,
    "hassubcategories": true,
    "subcategories": [
        {
            "id": 3808,
            "CategoryName": "Current Products",
            "CategoryImage": null,
            "hassubcategories": true,
            "subcategories": [
                {
                    "id": 4106,
                    "CategoryName": "Architectural",
                    "CategoryImage": "2637",
                    "hassubcategories": true,
                    "subcategories": [
                        {
                            "id": 391,
                            "CategoryName": "Flooring",
                            "CategoryImage": "2745",
                            "hassubcategories": false
                        }
                    ]
                }
            ]
        },
        {
            "id": 3809,
            "CategoryName": "Non-Current Products",
            "CategoryImage": null,
            "hassubcategories": true,
            "subcategories": [
                {
                    "id": 4107,
                    "CategoryName": "Desk",
                    "CategoryImage": "2638",
                    "hassubcategories": true,
                    "subcategories": [
                        {
                            "id": 392,
                            "CategoryName": "Wood",
                            "CategoryImage": "2746",
                            "hassubcategories": false
                        }
                    ]
                }
            ]
        }
    ]
}
8
ios85

si je devais le faire, je vais analyser la chaîne entière dans un JSONObject

JSONObject obj = new JSONObject(str);

alors je vois que vos sous-catégories sont un JSONArray. Je vais donc le convertir comme ça

JSONArray arr = new JSONArray(obj.get("subcategories"));

avec cela, vous pouvez faire une boucle et instancier votre objet de classe

for(int i = 0; i < arr.length; i++)
JSONObject temp = arr.getJSONObject(i);
Category c = new Category();
c.setId(temp.get("id"));
2
chuntato

Vous pouvez utiliser un objet JSON/un tableau JSON uniquement si la taille de vos données JSON est inférieure à 1 Mo. Sinon, vous devriez aller avec JSONReader. JSONReader utilise en réalité l'approche de diffusion en continu tandis que JSONObject et JSONArray chargent finalement toutes les données sur RAM à la fois, ce qui provoque une exception OutOfMemoryException dans le cas d'un json plus important.

9
Yasir Ali

GSON est le moyen le plus simple de travailler avec des objets imbriqués.

comme ça:

//after the fetched Json:
Gson gson = new Gson();

Event[] events = gson.fromJson(yourJson,  Event[].class);

//somewhere nested in the class:
static class Event{
    int id;
    String categoryName;
    String categoryImage;
    boolean hassubcategories;
    ArrayList<Event> subcategories;
}

Vous pouvez consulter ce tutoriel, http://androidsmith.com/2011/07/using-gson-to-parse-json-on-Android/ ou http://www.javacodegeeks.com/2011 /01/Android-json-parsing-gson-tutorial.html ou http://www.androidhive.info/2012/01/Android-json-parsing-tutorial/

5
Mustafa Ferhan

voici un exemple simple d'utilisation de Gson pour la modélisation d'arraylist d'objets via JsonReader:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = (TextView) findViewById(R.id.textviewtest);
    Task task = new Task();
    task.execute();
}

private class Task extends AsyncTask<Void, Void, ArrayList<Flower>> {

    @Override
    protected ArrayList<Flower> doInBackground(Void... params) {

        ArrayList<Flower> arrayFlowers = new ArrayList<Flower>();
        Flower[] f = null;
        try {
            String uri = "http://services.hanselandpetal.com/feeds/flowers.json";
            URL url = new URL(uri);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            Gson gson = new Gson();

            JsonReader reader = new JsonReader(new InputStreamReader(con.getInputStream()));
            f = gson.fromJson(reader, Flower[].class);

            for (Flower flower : f) {
                arrayFlowers.add(flower);
            }
        } catch (MalformedURLException e) {
            return null;
        } catch (IOException e) {
            return null;
        }
        return arrayFlowers;
    }
    @Override
    protected void onPostExecute(ArrayList<Flower> result) {
        StringBuilder sb = new StringBuilder();
        for (Flower flower : result) {
            sb.append(flower.toString());
        }
        tv.setText(sb.toString());
    }
}

et l'objet que j'ai modélisé:

public class Flower {

private String category;
private double price;
private String instructions;
private String photo;
private String name;
private int productId;

public String getCategory() {
    return category;
}
public void setCategory(String category) {
    this.category = category;
}
public double getPrice() {
    return price;
}
public void setPrice(double price) {
    this.price = price;
}
public String getInstructions() {
    return instructions;
}
public void setInstructions(String instructions) {
    this.instructions = instructions;
}
public String getPhoto() {
    return photo;
}
public void setPhoto(String photo) {
    this.photo = photo;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getProductId() {
    return productId;
}
public void setProductId(int productId) {
    this.productId = productId;
}
@Override
public String toString() {
    return getProductId() + " : " + name + "\n" + price + "$" + "\n" + "\n";
}
1
kasra fallen

Les exemples de données JSON que vous avez publiés ne semblent pas suivre la structure de données du JSON. Vous devrez construire vos données exactement de la même manière que celle enseignée dans le troisième link posté par Mustafa. C'est un très bon tutoriel. J'ai suivi les étapes et ça marche vraiment!

0
Lee-Ying Wu