在Golang结构和Json之间动态转换

时间:2019-02-02 17:08:49

标签: json go

我想知道是否有一种方法可以动态扩展结构中共享相同数据类型的条目数,而无需使用数组。

例如:

type MyHouse struct{
Bedroom *Bedroom `json:"bedroom"`
Kitchen *Kitchen `json:"Kitchen"`
}

type Kitchen struct{
Sink *Sink `json:"sink"`
Oven *Oven `json:"oven"`
}

type Oven struct{
Brand   string `json:"brand"`
HobSize []int  `json:"hobs"`

type Sink struct{
Volume int `json:"volume"`
}

type Bedroom struct{
Bed   *Bed   `json:"bed"`
Table *Table `json:"table"`
}

type Bed struct{
Brand string `json:"brand"`
Size  String `json:"size"`

type Table struct{
Brand       string `json:"brand"`
Legs        int    `json:"legs"`
SurfaceArea int    `json:"SurfacceArea"`
Draws       []Draws`json:"draws"`
}

type Draws struct{
Depth  int `json:"depth"`
Width  int `json:"width"`
Length int `json:"length"`
}
func main() { 
res := &MyHouse{
 Bedroom: &Bedroom{ 
  Bed: &Bed{
            Brand: "Sleepy",
            Size : "King"},
  Table: &Table{
              Brand    : "TabelY"
              Legs     : 1
              SurfaceAr: 32
              Draws    : []Draws{
                               {
                                Depth  :10
                                Width  :10
                                Length :10
                                },
                                {  
                                Depth  :20
                                Width  :10
                                Length :10   
                                }
                               }
                              }
                             }                   
Kitcken: &Kitchen{
 Oven: &Oven{
   Brand: "Bake right",
   hobs: []int{12,12,24,24}
}
Sink: &Sink{
 Volume: 56
}
}
}
restopring, _ := json.Marshal(res)

    fmt.Println(string(resprint)) 
}

只打印出确切的内容就可以了,如果我想简单地更改值,我可以将硬编码的值交换为变量(我不仅保持简单)。

我想要做的就是将另一张桌子添加到具有完全相同数据(不同值)的卧室,而不必将桌子变成一张桌子的阵列(对于房间来说实际上是相同的),以便我可以打印格式化后的json格式:

{MasterBedroom :(所有相关的东西)},{SpareBedroom :(其自己的东西)}

此外,这只是一个示例,实际上,它可能是具有100个房间的建筑物,每个房间都有很多家具,每个家具都需要不同的名称,但共享结构中定义的相同基本数据。我在考虑某种for循环,该循环可能会根据用户拥有多少间卧室并在json中动态创建那么多卧室来获取用户价值,例如:

{Bedroom1 :(所有相关的东西)},{Bedroom2 :(其自己的东西)} ....等等

我看过几个使用地图的示例,但最终打印出来了:

地图[[Bedroom1:[所有东西]],Bedroom2:[其东西]]

这也不符合我的需要

提前谢谢

在我给出的示例中要澄清,您将需要能够在json中建立无限数量的房间,而无需在我的房屋结构中使用[] bedrooms

这与某些人发布的以user:Frank为例的json marshal示例不同

1 个答案:

答案 0 :(得分:1)

在此之前询问并回答过: Converting Go struct to JSON

// Annotate the struct with json tags
type Foo struct {
    Number int    `json:"number"`
    Title  string `json:"title"`
}
// ...
foo := &Foo{Number: 123, Title: "Bar"}
f, err := json.Marshal(foo)