Golang中嵌套JSON结构体的处理与使用

Golang中嵌套JSON结构体的处理与使用 请参考 Go Playground - Go 编程语言

输出 2009/11/10 23:00:00 { “Name”: “AccountInfo”, “PolicyID”: “1”, “UpdatedTime”: “Tue, 10 Nov 2009 23:00:00 UTC”, “Elements”: { “Salutation”: “Mr.”, “FullName”: “Mak” } }

为什么我在根级别得到了时间戳? 我怎样才能用字符串常量(例如 “root”)替换它?


更多关于Golang中嵌套JSON结构体的处理与使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

你能在这里发布你的代码吗?否则我们无法定位问题所在?

更多关于Golang中嵌套JSON结构体的处理与使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请提供部分代码,特别是结构体定义和打印过程。

将:

log.Println(string(pageJson2))

替换为:

fmt.Println(string(pageJson2))

log 包会添加日期/时间格式。

在Golang中,日志包默认会在每条日志前添加时间戳。要解决这个问题,你可以自定义log.Logger的配置,或者使用JSON编码器直接输出结构体而不通过log包。

以下是两种解决方案:

方案1:使用自定义log.Logger(推荐)

package main

import (
    "encoding/json"
    "log"
    "os"
)

type AccountInfo struct {
    Name        string                 `json:"Name"`
    PolicyID    string                 `json:"PolicyID"`
    UpdatedTime string                 `json:"UpdatedTime"`
    Elements    map[string]interface{} `json:"Elements"`
}

func main() {
    // 创建自定义logger,移除时间戳和前缀
    logger := log.New(os.Stdout, "root ", 0)
    
    account := AccountInfo{
        Name:        "AccountInfo",
        PolicyID:    "1",
        UpdatedTime: "Tue, 10 Nov 2009 23:00:00 UTC",
        Elements: map[string]interface{}{
            "Salutation": "Mr.",
            "FullName":   "Mak",
        },
    }
    
    jsonData, _ := json.MarshalIndent(account, "", "    ")
    logger.Println(string(jsonData))
}

方案2:直接使用json.MarshalIndent输出

package main

import (
    "encoding/json"
    "fmt"
)

type AccountInfo struct {
    Name        string                 `json:"Name"`
    PolicyID    string                 `json:"PolicyID"`
    UpdatedTime string                 `json:"UpdatedTime"`
    Elements    map[string]interface{} `json:"Elements"`
}

func main() {
    account := AccountInfo{
        Name:        "AccountInfo",
        PolicyID:    "1",
        UpdatedTime: "Tue, 10 Nov 2009 23:00:00 UTC",
        Elements: map[string]interface{}{
            "Salutation": "Mr.",
            "FullName":   "Mak",
        },
    }
    
    jsonData, _ := json.MarshalIndent(account, "", "    ")
    fmt.Println("root", string(jsonData))
}

方案3:使用log.SetPrefix完全控制输出

package main

import (
    "encoding/json"
    "log"
    "os"
)

type AccountInfo struct {
    Name        string                 `json:"Name"`
    PolicyID    string                 `json:"PolicyID"`
    UpdatedTime string                 `json:"UpdatedTime"`
    Elements    map[string]interface{} `json:"Elements"`
}

func main() {
    // 设置全局logger前缀并移除时间戳
    log.SetOutput(os.Stdout)
    log.SetPrefix("root ")
    log.SetFlags(0)
    
    account := AccountInfo{
        Name:        "AccountInfo",
        PolicyID:    "1",
        UpdatedTime: "Tue, 10 Nov 2009 23:00:00 UTC",
        Elements: map[string]interface{}{
            "Salutation": "Mr.",
            "FullName":   "Mak",
        },
    }
    
    jsonData, _ := json.MarshalIndent(account, "", "    ")
    log.Println(string(jsonData))
}

所有方案都会输出:

root {
    "Name": "AccountInfo",
    "PolicyID": "1",
    "UpdatedTime": "Tue, 10 Nov 2009 23:00:00 UTC",
    "Elements": {
        "Salutation": "Mr.",
        "FullName": "Mak"
    }
}

关键点:

  1. log.SetFlags(0) 移除时间戳
  2. log.SetPrefix("root ") 设置自定义前缀
  3. 或者使用 log.New() 创建独立的logger实例
  4. 直接使用 fmt.Println 可以完全控制输出格式
回到顶部