我需要在该数据存储区中存储一片切片 . 由于数据存储区不支持两级切片,因此我将子切片编码为JSON并将其存储为 []byte . 我正在使用PropertyLoadSaver完成此任务 . 保存和加载工作,但我注意到保存的实体为每个父元素都有一个空的 []byte . 经过一些调查后,我发现这是由 Save() 方法中引用的 Variants.OptionsJSON 属性引起的,也是结构的属性引起的 .

所以我的问题是:

  • 这是一个错误还是我做错了什么?

  • 有没有更好的方法来实现这一目标?

我有一个约束是我需要能够通过“Variant”属性之一查询实体,而不是“Variant.Options” .

谢谢!

例:

鉴于JSON

{
  "variants": [{
    "options": [
      {
        "name": "One",
        "value": "one"
      },{
        "name": "Two",
        "value": "two"
      }]
    }, {
    "options": [
        {
        "name": "Three",
        "value": "three"
        },{
        "name": "Four",
        "value": "four"
        }]
    }]
  }]
}

它是如何存储在数据存储区中的,最后注意两个空的 '', '' 属性:

Entity Kind: Products
Entity Key: ahBkZXZ-c3RvcmVza2ktY29tchULEghQcm9kdWN0cxiAgICAgNDHCww
ID: 6507459568992256
Variants.OptionsJSON (list): `['[{"name":"One","value":"one"},{"name":"Two","value":"two"}]', '[{"name":"Three","value":"three"},{"name":"Four","value":"four"}]', '', '']`

model.go

import (
    "appengine/datastore"
    "encoding/json"
)

type Option struct {
    Name  string `json:"name"`
    Value string `json:"value"`
}

type Variant struct {
    OptionsJSON []byte   `json:"-" datastore:"OptionsJSON"`
    Options     []Option `json:"options" datastore:"-"`
}

type Product struct {
    Variants []Variant `json:"variants"`
}

func (x *Product) Load(c <-chan datastore.Property) error {
    if err := datastore.LoadStruct(x, c); err != nil {
        return err
    }
    for i, v := range x.Variants {
        var opts []Option
        json.Unmarshal(v.OptionsJSON, &opts)
        x.Variants[i].Options = opts
    }
    return nil
}

func (x *Product) Save(c chan<- datastore.Property) error {
    for _, v := range x.Variants {
        b, _ := json.Marshal(v.Options)
        c <- datastore.Property{
            Name:     "Variants.OptionsJSON",
            Value:    b,
            NoIndex:  true,
            Multiple: true,
        }
    }
    return datastore.SaveStruct(x, c)
}