Maison  >  Article  >  Java  >  Comment corriger l'erreur « BEGIN_OBJECT attendu mais NOM » lors de l'analyse de JSON imbriqué avec GSON sous Android ?

Comment corriger l'erreur « BEGIN_OBJECT attendu mais NOM » lors de l'analyse de JSON imbriqué avec GSON sous Android ?

DDD
DDDoriginal
2024-10-28 10:18:02902parcourir

How to Fix the

Analyse JSON avec GSON sous Android

Comment simplifier l'analyse JSON avec GSON sous Android ? Explorons un problème courant lors de l'utilisation de GSON et explorons une solution étape par étape.

Énoncé du problème :

Lorsque vous utilisez GSON pour analyser une chaîne JSON, vous peut rencontrer une erreur "BEGIN_OBJECT attendu mais était NAME". Cela se produit généralement lorsque vous tentez d'analyser un objet JSON imbriqué dans un tableau.

Exemple JSON :

Considérez les données JSON suivantes :

<code class="json">{
    "count": "12",
    "colbreak": 1,
    "name": "unary rels",
    "score": "9090",
    "Words": [
        {
            "count": 6,
            "word": "prp_għaċ-",
            "name": "prp_għaċ-",
            "score": 9.1,
            "Words": "kol",
            "seek": 2231297
        }
    ],
    "seek": 0
}</code>

Code :

Votre code utilisant GSON pour l'analyse :

<code class="java">public static <T> ArrayList<T> JsonParse(T t, String response) {
    // ...
    while (reader.hasNext()) {
        T cse = (T) gson.fromJson(reader, t.getClass());
        lcs.add(cse);
    }
    // ...
}</code>

Erreur :

Exécuter ceci Le code peut entraîner une erreur du type :

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 73

Solution :

Pour résoudre cette erreur, vous devez modifier la façon dont vous lisez la valeur JSON. Au lieu de parcourir toute la chaîne JSON, vous devez passer à l'objet spécifique que vous souhaitez analyser, puis le décoder.

Méthode révisée :

Voici une version corrigée de la méthode JsonParse :

<code class="java">public static <T> ArrayList<T> JsonParse(T t, String response) {
    // ...
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("Words")) {
            reader.beginArray();
            while (reader.hasNext()) {
                T cse = (T) gson.fromJson(reader, t.getClass());
                lcs.add(cse);
            }
            reader.endArray();
        } else {
            reader.skipValue();
        }
    }
    // ...
}</code>

Explication :

Dans cette méthode révisée, le code vérifie si le nom JSON actuel est "Words" et si c'est le cas, commence lire le tableau. Il parcourt ensuite chaque objet du tableau, les analyse à l'aide de GSON et les ajoute à la liste. Pour tout autre nom JSON, tel que « count » ou « score », la méthode les ignore simplement.

Considérations supplémentaires :

  • Assurez-vous que votre les classes de modèles (GsonParse et Words) ont des getters et des setters pour tous les champs JSON.
  • Si vous lisez JSON à partir d'un fichier du dossier Assets, assurez-vous d'utiliser InputStreamReader au lieu de JsonReader.
  • Pour prendre en charge les caractères UTF-8, convertissez la chaîne JSON en UTF-8 avant de l'analyser.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn