Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan struct untuk menghuraikan json bersarang dalam bahasa go

Menggunakan struct untuk menghuraikan json bersarang dalam bahasa go

WBOY
WBOYke hadapan
2024-02-06 08:15:09357semak imbas

Menggunakan struct untuk menghuraikan json bersarang dalam bahasa go

Kandungan soalan

Tidak dapat menggunakan go lang untuk menghuraikan json bersarang ke dalam objek struktur

Saya mempunyai rentetan json bersarang dan saya mahu menghuraikannya menggunakan struct dalam bahasa go. json kelihatan seperti ini

{"action":"add","business":{"listid":123,"objecttags":[{"tagcode":"csharp","tagname":"codename","tagvalue":["2"],"tagtype":3},{"tagcode":"golang","tagname":"coding","tagvalue":["3"],"tagtype":3}]}}

Saya ingin menghuraikan json menggunakan bahasa go. json mempunyai struktur bersarang jadi saya mencipta struktur yang disebutkan dalam kod berikut

package main

import (
    "encoding/json"
    "fmt"
)


type objecttagslist struct {
    tagcode  string
    tagname  string
    tagvalue []string
}

type model struct {
    action   string `json:"action"`
    business struct {
        listid     int64  `json:"listid"`
        objecttags []objecttagslist `json:"objecttags"`
    } `json:"business"`
}

func main() {
    json := `{"action":"add","business":{"listid":123,"objecttags":[{"tagcode":"csharp","tagname":"codename","tagvalue":["2"],"tagtype":3},{"tagcode":"golang","tagname":"coding","tagvalue":["3"],"tagtype":3}]}}`

    var model model
    json.unmarshal([]byte(json), &model)

    fmt.println(model.action) // this prints correctly as "add"
        fmt.println(model.business.listid) // this prints correctly as "123"


    fmt.println(model.business.objecttags) // this does not print the objecttags. rather this prints the objecttags as "[{  []} {  []}]"


}

Saya tidak boleh mendapatkan nilai json bersarang dalam ke dalam struktur.

Saya juga cuba membongkar struktur dalaman semula

var object []objecttagslist

//this gives error as cannot convert model.business.objecttags (variable of type []objecttagslist) to type []byte

json.unmarshal([]byte(model.business.objecttags), &object)

//Ralat, model.business.objecttags (pembolehubah jenis []objecttagslist) tidak boleh ditukar kepada jenis []bait

fmt.println(object)

Ini memberi saya ralat Tidak dapat menukar model.business.objecttags (pembolehubah jenis []objecttagslist) kepada menaip []bait.

Bagaimana untuk memetakan json ini ke dalam struktur? Saya ingin memetakannya sedemikian rupa sehingga saya boleh menggunakan objek seperti

model.Business.ObjectTags[0].tagCode //--> Should print/store "csharp"
model.Business.ObjectTags[0].tagValue[0] //--> Should print/store "2"

Sila bantu


Jawapan betul


Anda hanya boleh marshal/unmarshal "exported" medan - iaitu medan yang boleh diakses di luar pakej semasa, yang dalam go bermaksud "medan bermula dengan huruf besar". Jadi jika anda mengubah suai kod anda supaya kelihatan seperti ini:

package main

import (
    "encoding/json"
    "fmt"
)

type objecttagslist struct {
    tagcode  string
    tagname  string
    tagvalue []string
}

type model struct {
    action   string `json:"action"`
    business struct {
        listid     int64            `json:"listid"`
        objecttags []objecttagslist `json:"objecttags"`
    } `json:"business"`
}

func main() {
    json := `
{
  "action": "add",
  "business": {
    "listid": 123,
    "objecttags": [
      {
        "tagcode": "csharp",
        "tagname": "codename",
        "tagvalue": [
          "2"
        ],
        "tagtype": 3
      },
      {
        "tagcode": "golang",
        "tagname": "coding",
        "tagvalue": [
          "3"
        ],
        "tagtype": 3
      }
    ]
  }
}
`

    var model model
    json.unmarshal([]byte(json), &model)

    fmt.println(model.action)
    fmt.println(model.business.listid)

    fmt.println(model.business.objecttags)
}

Anda akan mendapat output:

add
123
[{csharp codename [2]} {golang coding [3]}]

Di sini kita mengambil kesempatan daripada fakta bahawa json 模块会自动将名为 tagcode 的键映射到名为 tagcode ialah medan struktur, tetapi sebenarnya kita harus jelas:

type ObjectTagsList struct {
    TagCode  string   `json:"tagCode"`
    TagName  string   `json:"tagName"`
    TagValue []string `json:"tagValue"`
}

Atas ialah kandungan terperinci Menggunakan struct untuk menghuraikan json bersarang dalam bahasa go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam