Структура Marshal в JSON расширила другую структуру с той же меткой поля - PullRequest
0 голосов
/ 22 мая 2018
  • У меня есть 2 struct, содержащее поле с той же меткой (id) и той же аннотацией JSON (`json:" id "`).
  • Один struct (Bar) включает в себя метки полей и их значения из других struct (Foo).

Я бы хотел, чтобы JSON назначил упаковщик struct Bar с обоими id полей, но внутреннее с другой аннотацией JSON (например, `json:" foo_id "`).Я не могу найти способ сделать это, но похоже, что-то, что должно быть выполнимо?

Имея быстрый взгляд здесь https://golang.org/pkg/encoding/json/ Я не могу найти решение.

Это вообще возможно?Есть ли работа вокруг?Я пытаюсь избежать всей схемы получения / установки для копирования / вставки значений между структурами, я надеюсь, что это как-то выполнимо.

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    ID int `json:"id"`
    Stuff string `json:"stuff"`
}

type Bar struct {
    ID int `json:"id"`
    Foo
    // the following does not work, 
    // I've tried a few variations with no luck so far
    // Foo.ID int `json:"foo_id"`
    OtherStuff string `json:"other_stuff"`
}

func main() {
    foo := Foo{ID: 123, Stuff: "abc" }
    bar := Bar{ID: 456, OtherStuff: "xyz", Foo: foo }

    fooJsonStr, _ := json.Marshal(foo)
    barJsonStr, _ := json.Marshal(bar)

    fmt.Printf("Foo: %s\n", fooJsonStr)
    fmt.Printf("Bar: %s\n", barJsonStr)
}

Дает этот вывод:

Foo: {"id":123,"stuff":"abc"} 
Bar: {"id":456,"stuff":"abc","other_stuff":"xyz"}

1 Ответ

0 голосов
/ 22 мая 2018

Одна структура (Bar) наследуется от другой структуры (Foo).

Очевидно, что нет, поскольку в Go нет наследования.

Если вам нужен идентификатор Fooбыть названным foo_id:

type Foo struct {
    ID int `json:"foo_id"`
    Stuff string `json:"stuff"`
}

Смертельно просто.

...