Невозможно проанализировать вложенную строку json в поля Struct в Golang - PullRequest
0 голосов
/ 08 июля 2019

Я пишу бэкэнд, используя 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

Я не знаю, что я могу исправить здесь, чтобы заставить его работать правильно.

...