Maison  >  Article  >  développement back-end  >  Le json.Unmarshal de Golang ne définit pas explicitement une valeur de pointeur sur zéro si le champ n'existe pas dans le JSON

Le json.Unmarshal de Golang ne définit pas explicitement une valeur de pointeur sur zéro si le champ n'existe pas dans le JSON

WBOY
WBOYavant
2024-02-09 08:12:08786parcourir

如果 JSON 中不存在该字段,Golang 的 json.Unmarshal 不会显式将指针值设置为 nil

Selon l'introduction de l'éditeur PHP Zimo, lorsque json.Unmarshal dans Golang analyse les données JSON, si un champ n'existe pas dans le JSON, il ne définira pas explicitement la valeur du pointeur sur zéro. Cela signifie que même si un champ est absent du JSON, le pointeur conservera toujours sa valeur d'origine, provoquant potentiellement des erreurs ou des exceptions dans votre programme. Par conséquent, lors de l'utilisation de json.Unmarshal, nous devons accorder une attention particulière à la gestion des champs manquants afin de garantir la stabilité et l'exactitude du programme.

Contenu de la question

Considérez cet exemple :

<code>package main

import (
    "encoding/json"
    "fmt"
)

type InternalStructFirst struct {
    Field string `json:"field"`
}
type ExternalStruct struct {
    StructA InternalStructFirst `json:"struct_a"`
    StructB *InternalStructFirst `json:"struct_b"`
}

func main() {
    var structVar ExternalStruct
    string1 := "{\"struct_a\":{\"field\":\"a\"},\"struct_b\":{\"field\":\"b\"}}"

    json.Unmarshal([]byte(string1), &structVar)
    fmt.Printf("first: %+v %+v\n", structVar.StructA, structVar.StructB)

    string2 := "{\"struct_a\":{\"field\":\"c\"}}"
    json.Unmarshal([]byte(string2), &structVar)
    fmt.Printf("second: %+v %+v\n", structVar.StructA, structVar.StructB)

    var structVar2 ExternalStruct
    json.Unmarshal([]byte(string2), &structVar)
    fmt.Printf("third: %+v %+v\n", structVar2.StructA, structVar2
}


</code>

Quels résultats :

first: {Field:a} &{Field:b}
second: {Field:c} &{Field:b}
third: {Field:} <nil>

Lorsque j'exécute json.Unmarshal pour la première fois, le StructB apparaît dans la réponse et est correctement désorganisé. Mais quand je fais cela une deuxième fois, cela ne semble pas le définir explicitement sur zéro lorsque le champ n'est pas affiché dans la réponse. Lorsque vous effectuez cela sur une structure pour laquelle ce champ n'est pas défini, il le définit sur zéro (ou ne le définit apparemment pas sur quelque chose) (comme indiqué dans le troisième exemple).

Si j'ai défini struct_b sur non nul, comment puis-je modifier mon exemple pour que lors de l'analyse d'une chaîne JSON qui ne contient pas de champ struct_b, le second struct_b 设置为非 nil,如何更改我的示例,以便在解析其中不包含 struct_b 字段的 JSON 字符串时,第二个 json.Unmarshal 将显式将 StructB 设置为 nil ?

解决方法

你不能。 json.Unmarshal 不会修改输入 JSON 中未表示的结构字段。要么使用空结构开始,要么在调用 Unmarshal sera Définir explicitement StructB sur nil ?

🎜Solution🎜🎜Vous ne pouvez pas. 🎜 Les champs Struct non représentés dans le JSON d'entrée ne seront pas modifiés. Commencez avec une structure vide ou définissez les champs sur la valeur que vous souhaitez avant d'appeler Unmarshal s'ils ne sont pas dans l'entrée JSON. 🎜

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