Unmarshalling для той же структуры, но с другим именем JSON - PullRequest
0 голосов
/ 11 октября 2019

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

Могу ли я упорядочить данные под другим именем json, например, иметь xyz вместо abc

{"abc":1}

до

{"xyz":1}
package main

import (
    "fmt"
    "encoding/json"
)

type SomeStruct struct {
    SomeField   int         `json:"abc"`
}

func main(){
    jsonData := []byte(`{"abc":1}`)
    strct := SomeStruct{}
    json.Unmarshal([]byte(jsonData), &strct)
    fmt.Println(strct)
    x, err := json.Marshal(strct)
    if err != nil {
        fmt.Println("errs", err)
    }
    finalValue := string(x)
    fmt.Println(finalValue)

    }

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Определите две структуры, одну для вашего ввода, одну для вашего вывода, и конвертируйте так:

package main

import (
    "fmt"
    "encoding/json"
)

type inStruct struct {
    SomeField   int         `json:"abc"`
}

type outStruct struct {
    SomeField   int         `json:"xyz"`
}

func main(){
    jsonData := []byte(`{"abc":1}`)
    strct := inStruct{}
    if err := json.Unmarshal(jsonData, &strct); err != nil {
        log.Fatal(err)
    }

    // Edit to reflect mkopriva's comment
    // outStruct := &outStruct{SomeField: strct.SomeField}
    outStruct := outStruct(strct)
    x, err := json.Marshal(outStruct)
    if err != nil {
        log.Fatal(err)
    }
    finalValue := string(x)
    fmt.Println(finalValue)
}
1 голос
/ 11 октября 2019

Вы можете потенциально реализовать собственный метод ToJSON для структуры, как показано ниже:

package main

import (
    "encoding/json"
    "fmt"
)

type SomeStruct struct {
    SomeField int `json:"abc"`
}

func (s *SomeStruct) ToJSON() string {
    return fmt.Sprintf("{\"xyz\":%d}", s.SomeField)
}

func main() {
    jsonData := []byte(`{"abc":1}`)
    strct := SomeStruct{}
    json.Unmarshal([]byte(jsonData), &strct)
    fmt.Println(strct)
    x, err := json.Marshal(strct)
    if err != nil {
        fmt.Println("errs", err)
    }
    finalValue := string(x)
    fmt.Println(finalValue)
    fmt.Println("custom ToJSON", strct.ToJSON())

}

Ссылка на игровую площадку: https://play.golang.org/p/mjW0dBPN59Q

Возможно, он не будет гибким в долгосрочной перспективехотя. Лично для такого требования я бы предпочел решение, опубликованное @ Clément

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