Maison  >  Article  >  développement back-end  >  Pourquoi mon code Go panique-t-il avec une erreur d'exécution lors de l'analyse d'un tableau JSON avec une virgule finale ?

Pourquoi mon code Go panique-t-il avec une erreur d'exécution lors de l'analyse d'un tableau JSON avec une virgule finale ?

DDD
DDDoriginal
2024-10-28 08:13:29886parcourir

Why Does My Go Code Panic with a Runtime Error When Parsing a JSON Array with a Trailing Comma?

Erreur d'exécution dans l'analyse du tableau JSON avec des virgules finales dans Go

Dave Cheney, un expert renommé de Go, souligne l'importance de terminer chaque ligne d'un littéral composite par une virgule. Cependant, cette règle semble être en contradiction avec l'analyse JSON dans Go.

Considérez le code suivant :

<code class="go">package main

import (
    "fmt"
    "encoding/json"
)

type jsonobject struct {
    Objects []ObjectType `json:"objects"`
}

type ObjectType struct {
    Name string `json:"name"`
}

func main() {
    bytes := []byte(`{ "objects": 
        [ 
            {"name": "foo"}, // REMOVE THE COMMA TO MAKE THE CODE WORK!
        ]}`)
    jsontype := &jsonobject{}
    json.Unmarshal(bytes, &jsontype)
    fmt.Printf("Results: %v\n", jsontype.Objects[0].Name) // panic: runtime error: index out of range
}</code>

Dans ce code, la suppression de la virgule de fin du tableau JSON le fait fonctionner. Cependant, n'y a-t-il pas un moyen d'éviter cette incohérence ?

La Résolution

Malheureusement non. La spécification JSON interdit les virgules finales. Il s'agit d'une syntaxe Go valide pour ajouter une virgule finale à une énumération ouverte qui continue sur une autre ligne. Cependant, cela ne s'applique pas à JSON.

Voici un exemple de structure JSON invalide :

{ "objects": 
    [ 
        {"name": "foo"},
]}

Même s'il était possible de persuader un analyseur JSON spécifique d'accepter ce format, d'autres des analyseurs JSON valides signaleraient à juste titre une erreur. Par conséquent, il est recommandé de respecter la spécification JSON et d'éviter les virgules finales.

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