Maison  >  Article  >  Java  >  Pourquoi est-ce que j'obtiens l'erreur \'java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 73\' lors de l'analyse des données JSON à l'aide de GSON sous Android ?

Pourquoi est-ce que j'obtiens l'erreur \'java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 73\' lors de l'analyse des données JSON à l'aide de GSON sous Android ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 14:07:291069parcourir

Why am I getting the

Comment analyser les données JSON à l'aide de GSON sous Android : résolution d'erreur

Lors de l'analyse des données JSON à l'aide de GSON sous Android, vous pouvez rencontrer l'erreur : "java.lang.IllegalStateException : BEGIN_OBJECT attendu mais était NAME à la ligne 1, colonne 73." Cette erreur indique un problème de syntaxe dans les données JSON, en particulier une accolade ouvrante manquante.

Solution possible

Pour résoudre ce problème, assurez-vous que vos données JSON sont correctement formaté et contient à la fois une accolade ouvrante et fermante. Par exemple :

<code class="json">{
    "count": "12",
    "colbreak": 1,
    ...
    "seek": 0
}</code>

Cause commune

Une cause courante de cette erreur est la réception de données JSON stockées dans un fichier ou téléchargées depuis un serveur sous forme de chaîne. . Dans de tels cas, la chaîne peut ne pas être correctement codée ou préfixée, ce qui peut entraîner des erreurs d'analyse.

Modification de classe personnalisée

Dans votre code, vous utilisez Java réflexion pour créer une classe personnalisée, GsonParse, pour représenter la structure de données JSON. Cette approche n'est généralement pas recommandée. Au lieu de cela, créez des méthodes getter et setter explicites pour chaque champ dans GsonParse. De plus, annotez les noms de classe et de champ avec @SerializedName pour qu'ils correspondent aux noms de propriétés JSON.

Voici un exemple :

<code class="java">public class GsonParse {

    @SerializedName("count")
    private String count;

    @SerializedName("colbreak")
    private String colbreak;

    @SerializedName("name")
    private String name;

    @SerializedName("score")
    private String score;

    @SerializedName("Words")
    private List<Words> mWords = new ArrayList<>();

    @SerializedName("seek")
    private String seek;

    // Add getters and setters here...
}</code>

Encodage UTF-8

Assurez-vous que vos données JSON sont correctement encodées au format UTF-8. Lors de la réception de données JSON via HTTP, le serveur doit répondre avec l'en-tête Content-Type approprié (par exemple, 'application/json; charset=utf-8').

Méthode d'analyse améliorée

Voici une version améliorée de votre méthode d'analyse qui utilise un Reader :

<code class="java">public static <T> ArrayList<T> JsonParse(T t, Reader reader) {
    ArrayList<T> lcs = new ArrayList<>();
    try {
        Gson gson = new Gson();
        JsonReader jsonReader = new JsonReader(reader);

        jsonReader.beginObject();
        while (jsonReader.hasNext()) {
            T cse = (T) gson.fromJson(jsonReader, t.getClass());
            lcs.add(cse);
        }
        jsonReader.endObject();
        jsonReader.close();
    } catch (UnsupportedEncodingException | IOException e) {
        e.printStackTrace();
    }
    return (ArrayList<T>) lcs;
}</code>

Utilisation

Pour utiliser cette méthode, créez un Reader à partir de votre source (par exemple, un fichier ou une réponse HTTP) et transmettez-le à la méthode JsonParse :

<code class="java">InputStream ims = assetManager.open("file.txt");
Reader reader = new InputStreamReader(ims, "UTF-8");

ArrayList<GsonParse> gsonObjects = JsonParse(new GsonParse(), reader);</code>

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