270

GoでJSON出力をきれいに印刷する簡単な方法を知っている人はいますか?

ストックhttp://golang.org/pkg/encoding/json/パッケージには、このための機能が含まれていないようです(編集: 含まれています。受け入れられた回答を参照してください)。

私が探している用途は、結果をきれいに印刷することとjson.Marshal、どこからでも JSON でいっぱいの文字列をフォーマットすることの両方であるため、デバッグ目的で読みやすくなります。

4

13 に答える 13

418

きれいな印刷とは、インデントされていることを意味すると思います

{
    "data": 1234
}

それよりも

{"data":1234}

これを行う最も簡単な方法は を使用することです。これにより、引数MarshalIndentを介してインデント方法を指定できます。indentしたがって、json.MarshalIndent(data, "", " ")インデントに 4 つのスペースを使用してプリティプリントします。

于 2013-09-26T21:17:58.893 に答える
140

JSONに変換したいオブジェクトがある場合、受け入れられた答えは素晴らしいです。この質問では、任意の JSON 文字列だけをきれいに印刷することについても言及しています。それが私がやろうとしていたことです。POST リクエスト (具体的にはCSP 違反レポート)から JSON をきれいにログに記録したかっただけです。

を使用するMarshalIndentには、Unmarshalそれをオブジェクトにする必要があります。あなたがそれを必要とするなら、それを求めてください、しかし私はしませんでした. バイト配列をきれいに印刷する必要がある場合Indentは、plain が最適です。

これが私が最終的に得たものです:

import (
    "bytes"
    "encoding/json"
    "log"
    "net/http"
)

func HandleCSPViolationRequest(w http.ResponseWriter, req *http.Request) {
    body := App.MustReadBody(req, w)
    if body == nil {
        return
    }

    var prettyJSON bytes.Buffer
    error := json.Indent(&prettyJSON, body, "", "\t")
    if error != nil {
        log.Println("JSON parse error: ", error)
        App.BadRequest(w)
        return
    }

    log.Println("CSP Violation:", string(prettyJSON.Bytes()))
}
于 2015-03-14T08:26:26.630 に答える
14

これが私が使用するものです。JSON の整形に失敗すると、元の文字列が返されます。JSON を含む必要がある HTTP 応答を出力するのに役立ちます。

import (
    "encoding/json"
    "bytes"
)

func jsonPrettyPrint(in string) string {
    var out bytes.Buffer
    err := json.Indent(&out, []byte(in), "", "\t")
    if err != nil {
        return in
    }
    return out.String()
}
于 2016-04-11T09:13:38.730 に答える
1

私は行くのが初めてですが、これは私がこれまでに集めたものです:

package srf

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

func WriteDataToFileAsJSON(data interface{}, filedir string) (int, error) {
    //write data as buffer to json encoder
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetIndent("", "\t")

    err := encoder.Encode(data)
    if err != nil {
        return 0, err
    }
    file, err := os.OpenFile(filedir, os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        return 0, err
    }
    n, err := file.Write(buffer.Bytes())
    if err != nil {
        return 0, err
    }
    return n, nil
}

これは関数の実行であり、単なる標準です

b, _ := json.MarshalIndent(SomeType, "", "\t")

コード:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"

    minerals "./minerals"
    srf "./srf"
)

func main() {

    //array of Test struct
    var SomeType [10]minerals.Test

    //Create 10 units of some random data to write
    for a := 0; a < 10; a++ {
        SomeType[a] = minerals.Test{
            Name:   "Rand",
            Id:     123,
            A:      "desc",
            Num:    999,
            Link:   "somelink",
            People: []string{"John Doe", "Aby Daby"},
        }
    }

    //writes aditional data to existing file, or creates a new file
    n, err := srf.WriteDataToFileAsJSON(SomeType, "test2.json")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("srf printed ", n, " bytes to ", "test2.json")

    //overrides previous file
    b, _ := json.MarshalIndent(SomeType, "", "\t")
    ioutil.WriteFile("test.json", b, 0644)

}
于 2019-07-24T23:35:03.223 に答える