如何解析Unmarshaled结构中的引用

时间:2018-11-13 15:06:49

标签: json go

我有两个在Go中解组的json文件。

第一个对象包含由第二个集合中的ID引用的某种类型的对象。

// Foo
{
  "id": 5,
  "key": "value"
}

// Bar
{
  "name": "bar",
  "fooReferenceId": 5
}

我想以struct结尾

type Bar struct {
  Name string
  Foo *Foo
}

有没有一种类似于我们提供json:"..."密钥解析器的方法来实现此目的?

类似

type Bar struct {
  Name string `json:"name"`
  Foo  *Foo   resolveFooById(`json:"fooReferenceId"`)
}

1 个答案:

答案 0 :(得分:2)

您需要使用自定义拆组器,如本文底部的示例:

http://choly.ca/post/go-json-marshalling/

对于您的示例,它看起来像:

func (b *Bar) UnmarshalJSON(input []byte) error {
    type Alias Bar
    aux := &struct {
        FooReferenceID int `json:"fooReferenceId"`
        *Alias
    }{
        Alias: (*Alias)(b),
    }
    if err := json.Unmarshal(input, &aux); err != nil {
        return err
    }
    for index, foo := range foos {
        if foo.ID == aux.FooReferenceID {
            b.Foo = &foos[index]
            break
        }
    }
    return nil
}

此处是完整的可执行示例:

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