为了账号安全,请及时绑定邮箱和手机立即绑定

如何将包含数组的 JSON 对象转换为单个 Struct 实例

如何将包含数组的 JSON 对象转换为单个 Struct 实例

Go
慕雪6442864 2023-07-10 14:36:49
我意识到有很多类似的问题,但我仍然无法找到我的问题的答案。我的 JSON 文件的相关部分如下所示:{     ...,    "roi": {        "roi": [            {                "id": "original",                "x": 600,                "y": 410,                "width": 540.0,                "height": 240.0            }        ]    },    ...}这是我定义结构的方式:type RoI struct {    Id     string  `json:"string"`                            // Default Value: "original"    Width  float64 `json:"width" validate:"gte=0,lte=10000"`  // RoI width (from 0 - 10000) - how much we move to the right from (X,Y) point    Height float64 `json:"height" validate:"gte=0,lte=10000"` // RoI height (from 0 - 10000) - how much we move down from the (X,Y) point    X      float64 `json:"x" validate:"gte=0,lte=10000"`      // X coordinate which together with Y coordinate forms a top left corner of the RoI (from 0 - 10000)    Y      float64 `json:"y" validate:"gte=0,lte=10000"`      // Y coordinate which together with X coordinate forms a top left corner of the RoI (from 0 - 10000)}我假设我总是会在"roi"数组中获得 1 个元素。请注意,我需要保留此结构用于许多不同的目的。我想将roi数组内的 1 个元素解析为RoI结构体。这是我到目前为止所尝试过的:var detectionResMap = make(map[string]interface{})err = json.Unmarshal(fileByteArr, &detectionResMap)if err != nil {    glog.Errorf("Error occurred while trying to Unmarshal JSON data into detectionResMap. Error message - %v", err)    return err}当我使用以下方式打印时detectionResMap["roi"]:glog.Infof("[INFO]: %v", reflect.TypeOf(detectionResMap["roi"]))glog.Infof("[INFO]: %v", detectionResMap["roi"])我得到以下输出:I0801 19:56:45.392362  125787 v2.go:87] [INFO]: map[string]interface {}I0801 19:56:45.392484  125787 v2.go:88] [INFO]: map[roi:[map[height:240 id:original width:540 x:600 y:410]]]我得到以下信息: { 0 0 0 0}如果我尝试将其更改为[]RoI:json: cannot unmarshal object into Go value of type []config.RoI任何帮助将不胜感激
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

您的尝试不起作用,因为roiByteArr, {"roi": [{ ... }]}this 不匹配config.RoI也不匹配[]config.RoI。


您可以声明一个与 json 匹配的类型:


type roiobj struct {

    RoI struct {

        RoI []RoI `json:"roi"`

    } `json:"roi"`

}


var obj roiobj

if err := json.Unmarshal(fileByteArr, &obj); err != nil {

    panic(err)

}

roi := obj.RoI.RoI[0]

操场

或者正确检索与您的结构相匹配的对象:


// in your real code do not omit safe type assertion like i'm doing here.

obj := detectionResMap["roi"].(map[string]interface{})["roi"].([]interface{})[0]

roiByteArr, err := json.Marshal(obj)

if err != nil {

    return err

}


roi := config.RoI{}

if err := json.Unmarshal(roiByteArr, &roi); err != nil {

    return err

}

操场

或者实现自定义解组器:


func (r *RoI) UnmarshalJSON(b []byte) error {

    type roi RoI

    var obj struct {

        RoI []roi

    }

    if err := json.Unmarshal(b, &obj); err != nil {

        return err

    }

    *r = RoI(obj.RoI[0])

    return nil

}


var fileobj struct {

    // ...

    RoI RoI `json:"roi"`

    // ...

}

if err := json.Unmarshal(fileByteArr, &fileobj); err != nil {

    panic(err)

}

roi := fileobj.RoI

操场


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信