首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在go中创建结构成员的不同结构?

如何在go中创建结构成员的不同结构?
EN

Stack Overflow用户
提问于 2022-02-21 16:30:43
回答 3查看 351关注 0票数 1

我从一个具有三个fix对象字段和一个具有不同json对象的字段的服务器获得一个json响应。

实例-回应1

代码语言:javascript
复制
{
   status : "success",
   error-code : "",
   message : "login successful",
   data : {
           token : "token value",
           refresh-token : "refresh token value"
          }
}

实例-回应2

代码语言:javascript
复制
{
   status : "success",
   error-code : "",
   message : "user data fetched",
   data : {
           first-name: "josh",
           last-name : "walter",
           age : "30",
           phone: 1234567890,
           address : "x street, dc"
          }
}

对于上面的json响应创建了结构,如下所示

代码语言:javascript
复制
type loginData struct {
    Token string `json:"token"`
    RefreshToken string `json:"refresh-token"`

}

type userdata {
    FirstName string    `json:"first-name"`
    LastName string     `json:"refresh-token"`
    Age string          `json:"age"`
    Phone string        `json:"phone"`
    Address string      `json:"address"`

}


type response struct {
    Status string       `json:"status"`
    ErrorCode string    `json:"error-code"`
    RespMessage string  `json:"message"`
    RespData string     `json:"data"`
}

如何在登录响应期间解除封送处理时添加logindata结构,以及在响应结构中的"RespData“字段中解封用户数据响应时添加userdata结构

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-22 07:04:17

@mkopriva,就像你说的,尝试过这个建议,它奏效了。

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type loginData struct {
    Token        string `json:"token"`
    RefreshToken string `json:"refresh-token"`
}

type userdata struct {
    FirstName string `json:"first-name"`
    LastName  string `json:"last-name"`
    Age       string `json:"age"`
    Phone     string `json:"phone"`
    Address   string `json:"address"`
}

type response struct {
    Status      string      `json:"status"`
    ErrorCode   string      `json:"error-code"`
    RespMessage string      `json:"message"`
    RespData    interface{} `json:"data"`
}

func main() {
    jsonresp_1 := `{
        "status" : "success",
        "error-code" : "",
        "message" : "login successful",
        "data" : {
                "token" : "token value",
                "refresh-token" : "refresh token value"
               }
     }`

    jsonresp_2 := `{
        "status" : "success",
        "error-code" : "",
        "message" : "user data fetched",
        "data" : {
                "first-name": "josh",
                "last-name" : "walter",
                "age" : "30",
                "phone": "1234567890",
                "address" : "x street, dc"
               }
     }`
    resp1 := strings.NewReader(jsonresp_1)
    data1 := loginData{}
    respdata1 := response{RespData: &data1}

    if err := json.NewDecoder(resp1).Decode(&respdata1); err != nil {
        fmt.Println(err)
    }
    fmt.Printf("token : %s \nrefreshtoken : %s \n", data1.Token, data1.RefreshToken)

    fmt.Println("-------------------")

    resp2 := strings.NewReader(jsonresp_2)
    data2 := userdata{}
    respdata2 := response{RespData: &data2}

    if err := json.NewDecoder(resp2).Decode(&respdata2); err != nil {
        fmt.Println(err)
    }
    fmt.Printf("firstname : %s \nlastname : %s ", data2.FirstName, data2.LastName)
}

输出

代码语言:javascript
复制
⚡ ⇒  go run main.go 
token : token value 
refreshtoken : refresh token value 
-------------------
firstname : josh 
lastname : walter
票数 0
EN

Stack Overflow用户

发布于 2022-02-21 17:04:14

首先更改RespData字段的类型:

代码语言:javascript
复制
type response struct {
    Status      string      `json:"status"`
    ErrorCode   string      `json:"error-code"`
    RespMessage string      `json:"message"`
    RespData    interface{} `json:"data"`
}

然后,根据您提出的请求,将RespData字段设置为指向预期类型的指针的预分配实例:

代码语言:javascript
复制
r, err := http.Get("https://some_api.com/loginData")
if err != nil {
    return err
}
defer r.Body.Close()

// check r.StatusCode and make sure it's correct

data := loginData{}
resp := response{RespData: &data}
if err := json.NewDecoder(r.Body).Decode(&resp); err != nil {
    return err
}

fmt.Println(data)
票数 2
EN

Stack Overflow用户

发布于 2022-02-21 17:08:03

根据我的说法,您应该有两个不同的structs来完成这个任务。其中一个原因是关注点的分离,因为这些响应的结构在将来可能会发生变化,这些响应来自两个不同的apis,因此维护不同的响应对象更好。

代码语言:javascript
复制
type loginData struct {
    Token        string `json:"token"`
    RefreshToken string `json:"refresh-token"`
}

type userdata struct {
    FirstName string `json:"first-name"`
    LastName  string `json:"refresh-token"`
    Age       string `json:"age"`
    Phone     string `json:"phone"`
    Address   string `json:"address"`
}

type response struct {
    Status      string `json:"status"`
    ErrorCode   string `json:"error-code"`
    RespMessage string `json:"message"`
}

type userResponse struct {
    response
    RespData userdata `json:"data"`
}

type loginResponse struct {
    response
    RespData loginData `json:"data"`
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71209800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档