第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在golang中使用未知結(jié)構(gòu)的json對(duì)象有更簡潔的方法嗎?

在golang中使用未知結(jié)構(gòu)的json對(duì)象有更簡潔的方法嗎?

Go
慕哥6287543 2021-11-15 20:52:11
當(dāng)我有一個(gè)可靠的 rest api 端點(diǎn)返回一些簡單的 json 時(shí),我可以使用結(jié)構(gòu)來準(zhǔn)確定義預(yù)期 json 結(jié)果的結(jié)構(gòu),但是我必須使用某些端點(diǎn)來返回非常大且復(fù)雜的 json 結(jié)果數(shù)據(jù),并且這些結(jié)果的結(jié)構(gòu)并不總是已知的。我一直在使用它來解組:type JsonObj map[string]interface{}func (jo JsonObj) GetString(name string) (string, error) {    if val, exists := jo[name]; exists {        if v, ok := val.(string); ok {            return v, nil        }        return "", errors.New(name+" is not a string")    }    return "", errors.New(name+" property not found")}func (jo JsonObj) GetFloat64(name string) (float64, error) {    if val, exists := jo[name]; exists {        if v, ok := val.(float64); ok {            return v, nil        }        return 0, errors.New(name+" is not a float64")    }    return 0, errors.New(name+" property not found")}以同樣的方式我有GetInt, GetBool, GetSlice, GetJsonObj,但是正如您所看到的,除了類型斷言參數(shù)之外,所有這些函數(shù)的內(nèi)容幾乎相同。有沒有辦法傳入類型斷言參數(shù)以將所有這些函數(shù)有效地減少為單個(gè)函數(shù)?
查看完整描述

1 回答

?
九州編程

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊

這是我現(xiàn)在最好的,作為一個(gè)非常簡單的例子:https : //play.golang.org/p/U9WJ0bIJPp 我無法想象你能夠壓縮/提取它比這更多:


package main


import (

    "fmt"

    "errors"

)


type T interface{}

type JsonObj map[string]T


func (jo JsonObj) Type(name string, defaultVal T, typeName string, typeAsserter func(val T) (T, bool)) (T, error){

    if val, exists := jo[name]; exists {

        if v, ok := typeAsserter(val); ok {

            return v, nil

        }

        return defaultVal, errors.New(name+" is not of type "+typeName)

    }

    return defaultVal, errors.New(name+" property not found")

}


func (jo JsonObj) String(name string) (string, error) {

    ret, err := jo.Type(name, "", "string", func(val T)(ret T, ok bool){ret, ok = val.(string);return})

    return ret.(string), err

}


func (jo JsonObj) Float64(name string) (float64, error) {

    ret, err := jo.Type(name, 0, "float64", func(val T)(ret T, ok bool){ret, ok = val.(float64);return})

    return ret.(float64), err

}


func (jo JsonObj) Int(name string) (int, error) {

    ret, err := jo.Type(name, 0, "int", func(val T)(ret T, ok bool){if ret, ok = val.(float64); ok {ret = int(ret.(float64))};return})

    return ret.(int), err

}


func (jo JsonObj) Bool(name string) (bool, error) {

    ret, err := jo.Type(name, false, "bool", func(val T)(ret T, ok bool){ret, ok = val.(bool);return})

    return ret.(bool), err

}


func main() {

    jo := JsonObj{

        "aString": "foo",

        "aFloat64": 3.142,

        "anInt": 42.0, //in a json string unmarshalling all numbers are float64 even "int"s

        "aBool": true,


    }

    fmt.Println(jo.String("aString"))

    fmt.Println(jo.Float64("aFloat64"))

    fmt.Println(jo.Int("anInt"))

    fmt.Println(jo.Bool("aBool"))

    fmt.Println(jo.String("missingString"))

    fmt.Println(jo.Bool("anInt"))

}

但正如評(píng)論中提到的,有一個(gè)庫提供了一種更強(qiáng)大的處理任意 json 的方法,https://github.com/bitly/go-simplejson


查看完整回答
反對(duì) 回復(fù) 2021-11-15
  • 1 回答
  • 0 關(guān)注
  • 286 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)