如何使用golang将多行json转换为单行json?

3

我可以使用Go将多行JSON转换为单行JSON吗?

来自:

{
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }

To:

{"release_date":"2004-11-09","status":"retired","engine":"Gecko","engine_version":"1.7"}


1
https://pkg.go.dev/encoding/json#Compact - Peter
3个回答

14

json.Compact()方法正是这样做的:

func Compact(dst *bytes.Buffer, src []byte) error

Compact appends to dst the JSON-encoded src with insignificant space characters elided.

json.Compact() 比反序列化和再次序列化更优秀,因为它适用于任何有效的JSON,并且速度非常快(它不会创建并丢弃Go值)。它也比使用任何正则表达式更优秀,同样速度非常快,并且正则表达式无法完全理解JSON语法,因此可能导致数据丢失。

例如:

func main() {
    dst := &bytes.Buffer{}
    if err := json.Compact(dst, []byte(src)); err != nil {
        panic(err)
    }
    fmt.Println(dst.String())
}

const src = `{
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }`

这将输出以下内容(您可以在Go Playground上尝试):
{"release_date":"2004-11-09","status":"retired","engine":"Gecko","engine_version":"1.7"}

2

将多行JSON反序列化为struct(或者是一个map[string]any{}),然后将其以无缩进选项的字符串形式编组。例如:

    v := struct {
        ReleaseDate string `json:"release_date"`
        Status      string `json:"status"`
        Engine      string `json:"engine"`
        Version     string `json:"engine_version"`
    }{}

    if err := json.Unmarshal([]byte(s), &v); err != nil {
        fmt.Printf("ERROR: %v\n", err)
    } else if bytes, err := json.Marshal(v); err != nil {
        fmt.Printf("ERROR: %v\n", err)
    } else {
        fmt.Printf("%v\n", string(bytes))
    }

(Go Playground)


0

如果你不知道将会得到哪种类型的JSON,只需像这样使用

package main

import (
    "encoding/json"
    "fmt"
)

const js = `
{
    "release_date": "2004-11-09",
    "status": "retired",
    "engine": "Gecko",
    "1": "1.7"
}
`

func main() {
    helper := make(map[string]interface{})

    err := json.Unmarshal([]byte(js), &helper)
    if err != nil {
        fmt.Printf("json.Unmarshal([]byte(s), &helper) failed. Error:  %v\n", err)
        return
    } 
    
    bytes, err := json.Marshal(helper)
    if err != nil {
        fmt.Printf("json.Marshal(helper) failed. Error:  %v\n", err)
        return
    }
    
    fmt.Println(string(bytes))
        
}

在这里尝试链接

不要使用替换空格,因为可能会损坏JSON值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接