首页 > 解决方案 > 解组到相同的结构但不同的 json 名称

问题描述

我正在尝试解组特定的 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)

    }

标签: jsongo

解决方案


定义两种结构,一种用于输入,一种用于输出,然后进行如下转换:

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)
}

推荐阅读