foo1 et la desc de Category->foo1. packagemainimport("encodage/json""fmt"/> foo1 et la desc de Category->foo1. packagemainimport("encodage/json""fmt">

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

Gestion du JSON non structuré imbriqué dans Go Lang

WBOY
WBOYavant
2024-02-11 22:36:091021parcourir

在 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)
    //}
}

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

Method is GET
desc is It may be possible.

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))

Ce qui précède affichera :

method is get

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))
}

Si je construis ceci :

go build -o example main.go

Voici comment cela fonctionne :

$ ./main
method is get

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)
}

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