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

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

在golang中使用未知結構的json對象有更簡潔的方法嗎?

在golang中使用未知結構的json對象有更簡潔的方法嗎?

Go
慕哥6287543 2021-11-15 20:52:11
當我有一個可靠的 rest api 端點返回一些簡單的 json 時,我可以使用結構來準確定義預期 json 結果的結構,但是我必須使用某些端點來返回非常大且復雜的 json 結果數(shù)據(jù),并且這些結果的結構并不總是已知的。我一直在使用它來解組: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ù)有效地減少為單個函數(shù)?
查看完整描述

1 回答

?
九州編程

TA貢獻1785條經(jīng)驗 獲得超4個贊

這是我現(xiàn)在最好的,作為一個非常簡單的例子: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"))

}

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


查看完整回答
反對 回復 2021-11-15
  • 1 回答
  • 0 關注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號