亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

解組 json 字段是 int 或 string

解組 json 字段是 int 或 string

Go
人到中年有點甜 2023-06-19 17:45:25
我有一個類型是的應用程序type Person struct {  Name string `json:"name"`  Age  int    `json:"age"`}但是我們有舊客戶端將Age字段作為字符串或整數發送,所以......{  "name": "Joe",  "age": "42"}或者{  "name": "Joe",  "age": 42}我知道我可以用“,字符串”注釋“年齡”字段,如果它是一個我想強制轉換為整數的字符串,但如果該字段可以是其中之一怎么辦?
查看完整描述

2 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

查看文檔中的“json - raw Message” ,從那里開始,您可以根據需要嘗試解析它。

package main


import (

? ? "encoding/json"

? ? "fmt"

? ? "log"

? ? "strconv"

? ? "unicode/utf8"

)


type Person struct {

? ? Name string? ? ? ? ? `json:"name"`

? ? Age? json.RawMessage `json:"age"`

}


func main() {

? ? var j = []byte(`{"name": "Joe","age": "42"}`)

? ? var j2 = []byte(`{"name": "Joe","age": 42}`)

? ? stringOrInt(j)

? ? stringOrInt(j2)

}


func stringOrInt(bytes []byte) {

? ? var p Person

? ? err := json.Unmarshal(bytes, &p)

? ? if err != nil {

? ? ? ? log.Fatal(err)

? ? }


? ? if utf8.Valid(p.Age) {

? ? ? ? i, err := strconv.Atoi(string(p.Age))

? ? ? ? if err != nil {

? ? ? ? ? ? fmt.Println("got int " + strconv.Itoa(i))

? ? ? ? } else {

? ? ? ? ? ? fmt.Println("got string")

? ? ? ? }

? ? } else {

? ? ? ? fmt.Println("whoops")

? ? }

}


查看完整回答
反對 回復 2023-06-19
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

package main


import (

    "encoding/json"

    "fmt"

    "strconv"

)


type Person struct {

    Name string `json:"name"`

    Age  int    `json:"age"`

}


func (p *Person) UnmarshalJSON(b []byte) error {

    var objMap map[string]*json.RawMessage

    err := json.Unmarshal(b, &objMap)

    if err != nil {

        return err

    }


    var name string

    err = json.Unmarshal(*objMap["name"], &name)

    if err != nil {

        return err

    }


    var ageInt int

    err = json.Unmarshal(*objMap["age"], &ageInt)

    if err != nil {

        // age  is string

        var ageString string

        err = json.Unmarshal(*objMap["age"], &ageString)

        if err != nil {

            return err

        }

        aI, err := strconv.Atoi(ageString)

        if err != nil {

            return err

        }

        p.Age = aI


    } else {

        p.Age = ageInt

    }


    p.Name = name


    fmt.Printf("%+v", *p)


    return nil

}


func main() {

    p := `{"name": "John", "age": "10"}`

    //  p := `{"name": "John", "age": 10}`



    newP := Person{}

    err := newP.UnmarshalJSON([]byte(p))

    if err != nil {

        fmt.Printf("Error %+v", err)

    }


}

https://play.golang.org/p/AK8H_wdNqmt

你可以嘗試這樣的事情。嘗試讀取并解析 Into int,如果無法檢查字符串值,則將其解析為 int,然后將 int 值分配給 person struct


查看完整回答
反對 回復 2023-06-19
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號