Я пишу бэкэнд, используя go для выполнения операций CRUD в хранилище данных. Единственное в своем роде «Правило» имеет поля:
name / ID {генерируется самой DS} numericID,
name String, active boolean, Условие условия.
Здесь структура Rule имеет структуру:
type Rule struct {
Name string `json:"name" datastore:"name,noindex"`
Active bool `json:"isActive" datastore:"active,noindex"`
Condition condition `json:"condition" datastore:"condition,noindex"`
}
Условие также одна структура, как-
type condition struct {
AdTargetingLogic adTargetingLogic `json:"adTargetingLogic"
datastore:"adTargetingLogic,noindex"`
AdUnit string `json:"adUnit" datastore:"adUnit,noindex"`
}
AdTargetingLogic - это еще одна структура as-
type AdTargetingLogic struct {
Type string `json:"type" datastore:"type,noindex"`
Operands []operands `json:"operands" datastore:"operands,noindex"`
Operator string `json:"operator" datastore:"operator,noindex"`
}
Операнды - это еще одна структура as-
type operands struct {
Type string `json:"type" datastore:"type,noindex"`
Key string `json:"key" datastore:"key,noindex"`
Value string `json:"value" datastore:"value,noindex"`
}
при сохранении и получении правила как объекта хранилища данных у меня возникают проблемы из-за вложенной структуры поля Условие. Если структура поля условия не является такой, как эта -
{"adTargetingLogic":{"operator":"AND","type":"EXPRESSION","operands":[{"key":"artlen","value":"small","type":"MATCH_AD_TARGETING"}]},"adUnit":"fiction"}
все работает отлично, но для поля условий с вложенной структурой-
{"adTargetingLogic":{"operator":"AND","type":"EXPRESSION","operands":[{"type":"MATCH_AD_TARGETING","key":"spon","value":"spon1"},{"key":"","value":"","type":"MATCH_AD_TARGETING"},{"operands":[{"type":"MATCH_AD_TARGETING","key":"trend","value":"trend1"},{"type":"MATCH_AD_TARGETING","key":"","value":""}],"operator":"AND","type":"EXPRESSION"}]},"adUnit":"fashion"}
Вещи не работают. Чтобы исправить это, во время сохранения правила сущности я попытался маршалировать поле условия как -
data, err := json.Marshal(ruleJS.Condition)
if err!= nil {
log.Errorf(ctx,"Marshal ERROR for rules %+v",err)
}
log.Errorf(ctx,"Marshal data for rules %+v",data)
ruleDS.Condition = string(data)
Аналогично этому, во время поиска я аннулирую это как ...
rJs := condition{}
err := json.Unmarshal([]byte(ruleDS.Condition), &rJs)
if err != nil {
log.Errorf(ctx," error while unmarshaling rules %+v",err)
}
ruleJS.Condition = rJs
Я не знаю, что я могу исправить здесь, чтобы заставить его работать правильно.