Maison > développement back-end > Golang > Gestion du JSON non structuré imbriqué dans Go Lang

Gestion du JSON non structuré imbriqué dans Go Lang

WBOY
Libérer: 2024-02-11 22:36:09
avant
1046 Les gens l'ont consulté

在 Go Lang 中处理嵌套非结构化 JSON

La gestion du JSON non structuré imbriqué dans Go Lang est une tâche critique. JSON (JavaScript Object Notation) est un format d'échange de données couramment utilisé, mais lorsque les données JSON sont imbriquées de manière complexe, elles peuvent devenir difficiles à traiter. L'éditeur PHP Yuzai vous présentera quelques méthodes et techniques de traitement du JSON non structuré imbriqué dans Go Lang pour vous aider à analyser et à exploiter ces données plus efficacement. En maîtrisant ces compétences, vous serez en mesure de gérer facilement des données JSON complexes, améliorant ainsi la lisibilité et la maintenabilité de votre code.

Contenu de la question

J'essaie de comprendre comment accéder à des données spécifiques à partir de données JSON non structurées dans Golang. J'ai le json suivant et j'essaie d'accéder à "foo1" sous le matériel lorsque foo1 a des données différentes de celles de foo2 qui sont vides. Lorsqu'un objet comme foo1 contient des données, je dois également lire les données de la section taxonomique du même nom. Par exemple. Puisque foo1 sous la section Material contient des données, j'aurais dû imprimer la valeur de la clé de la méthode sous Material->foo1 et la desc de Category->foo1.

package main

import (
    "encoding/json"
    "fmt"
)


type new struct {
    desc string `json:"desc"`
}

func main() {
    bjson := `{ 
                "classifications": { "foo1": { "desc": "it may be possible.", "sol": "the backups.", "ref": { "sensitive information": "https://www.sensitive_information.html", "control sphere": "https://ww.example.org/data.html" },"bar1": { "desc": "the target", "sol": "should be used.", "ref": { "abc: srgery": "https://www.orp.org/" } }}, 
               
                "material": { "backup file": [],"foo1": [ { "method": "get", "info": "it is not set", "level": 1, "parameter": "", "referer": "", "module": "diq", "curl_command": "curl \"https://example.com/\"", "wsg": [ "conf-12", "o-policy" ] }],"foo2": [],"bar1": []},
         
                "anomalies": { "server error": [], "resource consumption": [] }, 
                
                "additionals": { "web technology": [], "methods": [] }, 

                "infos": { "url": "https://example.com/", "date": "thu, 08 dec 2022 06:52:04 +0000"}}}`


    
        var parseddata = make(map[string]map[string]new)
    json.unmarshal([]byte(bjson), &parseddata)
    fmt.println("output of parseddata - \n", parseddata["classifications"]["foo1"].desc)
    
    //for _, v := range parseddata["material"] {
    //  fmt.println(v)
    //}
}
Copier après la connexion

Si foo1 n'est pas vide, résultat attendu :

Method is GET
desc is It may be possible.
Copier après la connexion

Solution de contournement

Vous pouvez le transformer en une variable map[string]interface{}, puis utiliser une série d'assertions de type pour obtenir les informations souhaitées, comme :

var parseddata = make(map[string]interface{})
json.unmarshal([]byte(bjson), &parseddata)
fmt.printf("method is %s\n", parseddata["classifications"].
  (map[string]interface{})["material"].
  (map[string]interface{})["foo1"].
  ([]interface{})[0].
  (map[string]interface{})["method"].(string))
Copier après la connexion

Ce qui précède affichera :

method is get
Copier après la connexion

Voici la version complète et fonctionnelle du code :

package main

import (
    "encoding/json"
    "fmt"
)

type new struct {
    desc string `json:"desc"`
}

func main() {
    bjson := `{ 
                "classifications": { "foo1": { "desc": "it may be possible.", "sol": "the backups.", "ref": { "sensitive information": "https://www.sensitive_information.html", "control sphere": "https://ww.example.org/data.html" },"bar1": { "desc": "the target", "sol": "should be used.", "ref": { "abc: srgery": "https://www.orp.org/" } }}, 
               
                "material": { "backup file": [],"foo1": [ { "method": "get", "info": "it is not set", "level": 1, "parameter": "", "referer": "", "module": "diq", "curl_command": "curl \"https://example.com/\"", "wsg": [ "conf-12", "o-policy" ] }],"foo2": [],"bar1": []},
         
                "anomalies": { "server error": [], "resource consumption": [] }, 
                
                "additionals": { "web technology": [], "methods": [] }, 

                "infos": { "url": "https://example.com/", "date": "thu, 08 dec 2022 06:52:04 +0000"}}}`

    var parseddata = make(map[string]interface{})
    json.unmarshal([]byte(bjson), &parseddata)
    fmt.printf("method is %s\n", parseddata["classifications"].(map[string]interface{})["material"].(map[string]interface{})["foo1"].([]interface{})[0].(map[string]interface{})["method"].(string))
}
Copier après la connexion

Si je construis ceci :

go build -o example main.go
Copier après la connexion

Voici comment cela fonctionne :

$ ./main
method is get
Copier après la connexion

Vérifiez si la valeur n'existe pas ou s'il s'agit d'une liste vide :

data := parsedData["classifications"].(map[string]interface{})["Material"].(map[string]interface{})
val, ok := data["foo2"]
if !ok {
  panic("no key foo2 in map")
}

if count := len(val.([]interface{})); count == 0 {
  fmt.Printf("foo2 is empty\n")
} else {
  fmt.Printf("foo2 has %d items", count)
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal