2015-03-24 9 views
15

próbuję wrócić trochę JSON z serwera, ale ten błąd z następującego koduJak przekonwertować (typ * bytes.Buffer) do wykorzystania jako [] bajt argumentu w.Write

cannot use buffer (type *bytes.Buffer) as type []byte in argument to w.Write 

Przy odrobinie googling znalazłem this SO answer ale nie mógł zmusić go do pracy (patrz drugi przykładowy kod z komunikatem o błędzie)

1st przykładowy kod

buffer := new(bytes.Buffer) 

for _, jsonRawMessage := range sliceOfJsonRawMessages{ 
    if err := json.Compact(buffer, jsonRawMessage); err != nil{ 
     fmt.Println("error") 

    } 

} 
fmt.Println("json returned", buffer)//this is json 
w.Header().Set("Content-Type", contentTypeJSON) 

w.Write(buffer)//error: cannot use buffer (type *bytes.Buffer) as type []byte in argument to w.Write 

2nd próbki kodu z błędem

cannot use foo (type *bufio.Writer) as type *bytes.Buffer in argument to json.Compact 
cannot use foo (type *bufio.Writer) as type []byte in argument to w.Write 


var b bytes.Buffer 
foo := bufio.NewWriter(&b) 

for _, d := range t.J{ 
    if err := json.Compact(foo, d); err != nil{ 
     fmt.Println("error") 

    } 

} 


w.Header().Set("Content-Type", contentTypeJSON) 

w.Write(foo) 

Odpowiedz

23

Zapis wymaga []byte (kawałek bajtów), a masz *bytes.Buffer (wskaźnik do bufora).

Można uzyskać dane z bufora z Buffer.Bytes() i podać, że do Write():

_, err = w.Write(buffer.Bytes()) 

... lub użyj Buffer.WriteTo() skopiować zawartość bufora bezpośrednio do Writer:

_, err = buffer.WriteTo(w) 

Korzystanie z bytes.Buffer nie jest konieczne. json.Marshal() Zwraca []byte bezpośrednio:

var buf []byte 

buf, err = json.Marshal(thing) 

_, err = w.Write(buf) 
+0

Dziękuję, ale wymaga trochę wyjaśnień. Co chciałbym przekazać json.Compact w tej sytuacji (które muszę użyć, aby usunąć \ n i \ t)? Czy możesz podać nieco więcej informacji dotyczących mojej próbki kodu? Dziękuję, jeśli możesz pomóc. – Leahcim

+0

na przykład, to wypisuje bajty do mojego terminala- 'fmt.Println (" json zwrócił ", buffer.Bytes())', jeśli przekażę buffer.Bytes() do w.Write, czy nie zwróci on strumienia również bajty. Potrzebuję jsona. Uwaga: nie mogę tego przetestować, ponieważ są inne problemy z moją przeglądarką. – Leahcim

+0

@Leahcim Jeśli chcesz go wydrukować, wypróbuj 'buffer.String()'. 'buffer.Bytes()' zwraca zakodowane w UTF-8 bajty tekstu json. – icza

Powiązane problemy