4

Goは初めてで、作成したJSONを印刷する方法がわかりません。「encoding/json」を使用していますが、[]バイトが返されます。しかし、これを印刷しようとすると、次のようになります。

cannot use json_msg (type []byte) as type string in function argument

これを受け取った後、私は[]byte配列を文字列または空のインターフェースに変換しようとしました。しかし、私はそれを機能させることができないようです。何か案は?以下の関連コード:

type Message struct {
    Id int
    Name string
}



for _, row := range rows {
    m := Message{row.Int(0), row.Str(1)}

    json_msg, err := json.Marshal(m)

    if err == nil {
        panic(err)
    }//if

            //tried below to print out a interface, didn't work either
    //var f interface{}
    //err = json.Unmarshal(json_msg, &f)

    fmt.Fprintf(c.ResponseWriter, json_msg)
}//for
4

3 に答える 3

15

探しているものを入手する方法はいくつかあります。

まず、fmt.Fprintfタイプがfunc(io.Writer, string, ...interface{}). あなたはそれに合格c.ResponseWriterしているので、私はそれが満足するものだと思いますio.Writer. の 2 番目の引数fmt.Fprintfはフォーマット文字列です。何かを文字列として出力する場合は、%sフォーマット文字列を使用するため、次のようになります。

fmt.Fprintf(c.ResponseWriter, "%s", json_msg)

それはあなたの質問に直接答えますが、もう少し先に進みましょう: それはあなたが解決しようとしている問題を解決する正しい方法ですか? いいえ、そうではありません。そのようにするのは少し奇妙です。

fmt.Fprintfまず、 が を受け入れることがわかっているのでio.Writer、 という形式のメソッドで何かについて話していることになりますWrite([]byte) (int, error)。でメソッドを直接呼び出すことで、その[]byteデータを に書き込むことができます。ResponseWriterWrite()ResponseWriter

_, err := c.ResponseWriter.Write(json_msg)

それは少し厄介ではありません。結局のところ、これを行うにはさらに良い方法がありますjson.Encoder。Ajson.Encoderは を埋め込んだ構造体であり、任意の構造体io.Writerに効果的にメソッドを追加します。このメソッドは、構造体を json にエンコードし、それらをライターに書き込みます。違いは、データをメモリ内のバイト スライスにエンコードしてから、次のように直接書き込むことができるときにそれを にコピーすることです。io.WriterEncodeio.Writer

err := json.NewEncoder(c.ResponseWriter).Encode(m)

[]byteそして今、あなたはその中間フォーマットさえ持っていません。

于 2013-01-28T21:42:22.637 に答える
2

タイプ関数でjson_msgフォーマット文字列として使用していますが、これはフォーマット文字列としてのみ例外です (とは異なるタイプです。ただし、互いにキャストすることはできます)。バイト スライスを記述する適切な方法は、書式文字列を指定することです。Printfstring[]bytestring

fmt.Fprintf(WRITER_OBJ, "%s", json_msg)

これにより、[]byteUnicode コンテンツがそのまま出力されます。Fprintf/Printf では、フォーマット文字列として変数を使用しないでください。C のように問題になるとは思いませんが、JSON に "%" が含まれていると問題が発生する可能性があります。

于 2013-01-29T05:49:42.687 に答える
1
fmt.Fprintf(c.ResponseWriter, string(json_msg))

あなたをにキャストする正しい方法でしょ[]bytestring

于 2013-01-28T18:35:00.023 に答える