JSON串转结构体如何只转里面的一个字段

我该如何改造下面的代码,让我直接获取到 result 里面的结果,因为我认为,Respond 结构体是无用的,我想只定义一个结构体 User ,我的代码只需要用到它。

package main

import (
    "encoding/json"
    "fmt"
)

type Respond struct {
    Status  int
    Message string
    Result  User
}

type User struct {
    Name string
    Age  int
}

func main() {
    body := `{"status":1,"message":"OK","result":{"name":"brad","age":19}}`;
    respond := &Respond{}
    _ = json.Unmarshal([]byte(body), respond)
    if respond.Status != 1 {
        panic("获取失败")
    }
    fmt.Print(respond)
}
pardon110
最佳答案

可以使用gjson库 ,类似xpath,css样查询器,用它定位到你要解析的字段json串,如下所示

package main

import (
    "encoding/json"
    "fmt"

    "github.com/tidwall/gjson"
)

type User struct {
    Name string
    Age  int
}

func main() {
    body := `{"status":1,"message":"OK","result":{"name":"brad","age":19}}`
    // 只获取状态值
    fmt.Println(gjson.Get(body, "status"))
    // 获取姓名
    fmt.Println(gjson.Get(body, "result.name"))
    // 用户信息结构体
    var user User
    err := json.Unmarshal([]byte(gjson.Get(body, "result").String()), &user)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v", user)
}

输出

1
brad
{Name:brad Age:19}
3年前 评论
忆往昔弹指间 (楼主) 3年前
zpers 3年前
讨论数量: 1
pardon110

可以使用gjson库 ,类似xpath,css样查询器,用它定位到你要解析的字段json串,如下所示

package main

import (
    "encoding/json"
    "fmt"

    "github.com/tidwall/gjson"
)

type User struct {
    Name string
    Age  int
}

func main() {
    body := `{"status":1,"message":"OK","result":{"name":"brad","age":19}}`
    // 只获取状态值
    fmt.Println(gjson.Get(body, "status"))
    // 获取姓名
    fmt.Println(gjson.Get(body, "result.name"))
    // 用户信息结构体
    var user User
    err := json.Unmarshal([]byte(gjson.Get(body, "result").String()), &user)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v", user)
}

输出

1
brad
{Name:brad Age:19}
3年前 评论
忆往昔弹指间 (楼主) 3年前
zpers 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!