Golang Отменить маршалинг ответа JSON, затем маршалировать с именами полей Struct - PullRequest
0 голосов
/ 04 августа 2020

Итак, я нажимаю API, который возвращает ответ JSON, и я разупорядочиваю его в такую ​​структуру:

package main



type ProcessedRecords struct {
    SLMIndividualID                  string      `json:"individual_id"`
    HouseholdPosition                int         `json:"Household Position"`
    IndividualFirstName              string      `json:"individual_first_name"`
}

func main() {
    req, _ := http.NewRequest(method, url, payload)

    res, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
    }
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
    }
    
    fmt.Println(body)
    
    var responseObject Response
    json.Unmarshal(body, &responseObject)
    fmt.Println(responseObject)

, которая отлично работает. Однако мне нужно снова маршалировать эту структуру, но я хочу использовать поля структуры в качестве ключей вместо полей json: .... Я использую следующий код:

    recordsInput := []*firehose.Record{}
    for i := 0; i < len(records); i++ {
        if len(recordsInput) == 500 {
            * code to submit records, this part works fine *
        }

        b, err := json.Marshal(records[i])

        if err != nil {
            log.Printf("Error: %v", err)
        }

        record := &firehose.Record{Data: b}
        recordsInput = append(recordsInput, record)
    }

Это успешно отправляет записи, но в формате:

{"individual_id":"33c05b49-149b-480f-b1c2-3a3b30e0cb6f","Household Position":1...}

, и я бы хотел его в формате:

{"SLMIndividualId":"33c05b49-149b-480f-b1c2-3a3b30e0cb6f","HouseholdPosition":1...}

Как этого добиться?

1 Ответ

1 голос
/ 04 августа 2020

Эти теги говорят, как структура должна быть упорядочена, поэтому, если они присутствуют, именно так и будет вывод. Вам нужно будет преобразовать его в соответствующую структуру, у которой нет тегов json::

type ProcessedRecords struct {
    SLMIndividualID     string `json:"individual_id"`
    HouseholdPosition   int    `json:"Household Position"`
    IndividualFirstName string `json:"individual_first_name"`
}

type ProcessedRecordsOut struct {
    SLMIndividualID     string
    HouseholdPosition   int
    IndividualFirstName string
}

func process() {
    var in ProcessedRecords
    json.Unmarshal(data, &in)
    // Convert to same type w/o tags
    out := ProcessedRecordsOut(in)
    payload, _ := json.Marshal(out)
    // ...
}

См. Рабочий пример здесь: https://play.golang.org/p/p0Fc8DJotYE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...