V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ejfkdev
V2EX  ›  Go 编程语言

请教一个 json 序列化实现的问题

  •  1
     
  •   ejfkdev ·
    ejfkdev · 27 天前 · 1031 次点击

    能否定义 struct ,json 化输出 string

    希望内层数据能在使用时用 struct ,序列化时,转成 string

    比如

    
    type User struct {
        Name string `json:"name"`
    }
    
    type UsersContainer struct {
        Users []User `json:"users"`
    }
    
    users := []User{{Name: "aaa"}}
    container := UsersContainer{Users: users}
    
    

    正常转成 json 后是 {"users":[{"name":"aaa"}]}"

    有些 http api 会把一个变量参数定义成 string 格式

    期望结果是 {"users":"[{\"name\":\"aaa\"}]"}"

    6 条回复    2024-04-04 17:54:25 +08:00
    danbai
        1
    danbai  
       27 天前 via Android
    你可以给里面的结构体实现自定义序列号方法
    danbai
        2
    danbai  
       27 天前 via Android
    给某个类型实现。UnmarshalJSON([]byte) error 和 MarshalJSON() ([]byte, error)
    danbai
        3
    danbai  
       27 天前 via Android
    []User 可以单独定为一个类型
    NX2023
        4
    NX2023  
       27 天前
    你可以使用 HTML 转义,比如 " 变成 " ,然后到另一段再转换回来
    fzdwx
        5
    fzdwx  
       27 天前 via Android
    在转一遍
    body007
        6
    body007  
       27 天前   ❤️ 1
    ```go
    package main

    import (
    "encoding/json"
    "fmt"
    )

    func main() {
    users := []User{{Name: "aaa"}}

    b, err := marshal(users, true)
    if err != nil {
    panic(err)
    }
    fmt.Printf("%s\n", b)

    b, err = marshal(users, false)
    if err != nil {
    panic(err)
    }
    fmt.Printf("%s\n", b)
    }

    type User struct {
    Name string `json:"name"`
    }

    type UsersContainer struct {
    Users any `json:"users"`
    }

    func marshal(user []User, str bool) ([]byte, error) {
    var container UsersContainer
    if str {
    b, err := json.Marshal(user)
    if err != nil {
    return nil, err
    }
    container.Users = string(b)
    } else {
    container.Users = user
    }
    return json.Marshal(container)
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2499 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 14:06 · PVG 22:06 · LAX 07:06 · JFK 10:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.