json Unmarshal заменяет свойства на ноль, если они структурированы в тегах - PullRequest
0 голосов
/ 03 марта 2019

Вот структура немаршальной цели:

type ParsedObjectType struct{
    Value struct{
        E []struct {
            B bool
            C float32 `json:"coefficient"`
            CE float32
            G int `json:"group"`
            P float32 `json:"period"`
            T int `json:"type"`
        }
    }
}

И строка soucre выглядит следующим образом:

{"B":false,"C":2.123,"CE":0,"G":1,"P":1000,"T":0}

После json.Unmarshal([]byte(string), ParsedObjectType) я получаю

{
    "B": false,
    "coefficient": 0,
    "CE": 0,
    "group": 0,
    "period": 0,
    "type": 0
}

снули вместо исходных данных в свойствах

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

У вас есть две большие проблемы:

  1. Ваши теги полностью неверны.Ваш ввод содержит, например, "C":2.123, но ваши теги struct означают, что Unmarshaler ищет "coefficient":2.123, который он никогда не найдет.Чтобы исправить это, установите теги, соответствующие вашему вводу:

    type ParsedObjectType struct{
        Value struct{
            E []struct {
                B  bool
                C  float32 `json:"C"`
                CE float32
                G  int     `json:"G"`
                P  float32 `json:"P"`
                T  int     `json:"T"`
            }
        }
    }
    

    Обратите внимание, что теперь ваши поля структуры точно соответствуют ключам JSON, поэтому вы можете просто полностью исключить теги JSON для простоты, если хотите:

    type ParsedObjectType struct{
        Value struct{
            E []struct {
                B  bool
                C  float32
                CE float32
                G  int
                P  float32
                T  int
            }
        }
    }
    
  2. Ваша структура данных не соответствует вашему вводу.Ваши входные данные выглядят как один объект, но ваши входные данные ожидают объект внутри объекта.Чтобы исправить это (при условии, что введенные вами данные в вашем вопросе завершены), избавьтесь от дополнительного слоя в вашей структуре данных:

    type ParsedObjectType struct{
        B  bool
        C  float32
        CE float32
        G  int
        P  float32
        T  int
    }
    
0 голосов
/ 03 марта 2019

Как я понимаю в json у вас есть компактные имена, но это не должно заставлять вас создавать загадочные имена в структурах.

В коде вы должны использовать значимые имена, но в сериализованном формате выможно использовать синонимы.

Адаптировано из вашего примера: детская площадка: https://play.golang.org/p/gbWhV3FfHMr

package main

import (
    "encoding/json"
    "log"
)

type ParsedObjectType struct {
    Value struct {
        Items []struct {
            Coefficient float32 `json:"C"`
            Group       int     `json:"G"`
            Period      float32 `json:"P"`
            TypeValue   int     `json:"T"`
        } `json:"E"`
    }
}

func main() {

    str := `{"Value": {
            "E": [
              {
                "B": false,
                "C": 2.123,
                "CE": 0,
                "G": 1,
                "P": 1000,
                "T": 0
              }
            ]
          }
        }`

    out := &ParsedObjectType{}
    if err := json.Unmarshal([]byte(str), out); err != nil {
        log.Printf("failed unmarshal %s", err)
    }

    log.Printf("Constructed: %#v", out)
}
0 голосов
/ 03 марта 2019

Если вы хотите проанализировать {"B":false,"C":2.123,"CE":0,"G":1,"P":1000,"T":0} до

{
"B": false,
"coefficient": 0,
"CE": 0,
"group": 0,
"period": 0,
"type": 0
}

Я думаю, ваша структура должна быть объявлена ​​как

struct {
        B bool
        coefficient float32 `json:"C"`
        CE float32
        group int `json:"G"`
        period float32 `json:"P"`
        type int `json:"T"`
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...