Maison  >  Article  >  développement back-end  >  Les données du fichier json.Unmarshal sont valides, mais json.NewDecoder().Decode() n'est pas valide

Les données du fichier json.Unmarshal sont valides, mais json.NewDecoder().Decode() n'est pas valide

WBOY
WBOYavant
2024-02-09 12:15:31822parcourir

json.Unmarshal 文件数据有效,但 json.NewDecoder().Decode() 无效

l'éditeur php Strawberry vous présentera un problème concernant l'analyse JSON. Parfois, nous rencontrons une situation dans laquelle l'utilisation de json.Unmarshal pour analyser les données d'un fichier est efficace, mais l'utilisation de json.NewDecoder().Decode() n'est pas efficace. Ce problème peut survenir dans la logique du code ou dans le format des données. Ci-dessous, nous analyserons en détail les causes possibles et proposerons des solutions.

Contenu de la question

Ce qui suit désorganise correctement la structure :

func foo() {
  d, err := os.readfile("file.json")

  var t t
  if err := json.unmarshal(d, &t); err != nil {
    panic(err)
  }
}

Mais cela ne fonctionne pas et génère un tas d'erreurs d'analyse json classiques, eofunexpected token 't' etc.

func foo() {
  f, err := os.open("file.json")
  
  var t t
  if err := json.newdecoder(f).decode(&t); err != nil {
    panic(err)
  }
}

Savez-vous pourquoi ? os.file[]byte Utilisée dans deux goroutines en même temps, la structure json est la suivante (certains champs sont omis) :

{
  "data": [
    {
      "field": "stuff",
      "num": 123,
    },
    ...
  ]
}

Solution

os.File[]byte Utiliser dans deux goroutines en même temps...

C'est ça le problème. os.File Il existe un pointeur de fichier interne où se produit la prochaine lecture. Si deux entités non liées continuent à lire des données, elles ne peuvent pas lire les données qui se chevauchent. Les octets lus par la première entité ne sont pas répétés dans la seconde entité.

De plus, os.File n'est pas sûr pour une utilisation simultanée (la documentation n'indique pas explicitement qu'il est sûr) : appeler ses méthodes à partir de plusieurs goroutines simultanées peut provoquer des courses de données.

Lorsque vous transmettez []byte à plusieurs fonctions/goroutines qui « lisent depuis », il n'y a pas de pointeurs partagés ni de variables d'index. Chaque fonction/goroutine conservera son index séparément, et il est possible de lire les variables de plusieurs goroutines (dans ce cas, les champs de l'en-tête de tranche et des éléments de tranche).

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer