개체가 있습니다.을 사용하여 json으로 객체를 인코딩합니다.크기가 JSON으로 인코딩 된 객체의 비트 수입니까?
두 비트 모두에서 json 문자열의 크기를 측정하려면 어떻게해야합니까?
개체가 있습니다.을 사용하여 json으로 객체를 인코딩합니다.크기가 JSON으로 인코딩 된 객체의 비트 수입니까?
두 비트 모두에서 json 문자열의 크기를 측정하려면 어떻게해야합니까?
io.Writer
및 json.Encoder
은 기록 된 바이트 수를 노출하거나 유지하지 않습니다.
먼저 json.Marshal()
을 사용하여 []byte
에 값을 마샬링하고 길이는 len()
내장 함수로 얻을 수 있습니다. 당신이 찾는 비트 수는 8을 곱한 길이입니다 (1 바이트는 8 비트 임). 그런 다음 출력에 바이트 슬라이스를 수동으로 써야합니다. 작은 유형의 경우 이는 문제가되지 않지만 큰 구조체/값의 경우 바람직하지 않을 수 있습니다. 또한 불필요한 작업을 마샬링하여 길이를 확보하고 슬라이스를 수동으로 작성합니다.
훨씬 더 더 우아한 방법은 embedding을 사용하여 기록 된 바이트를 관리 할 수있는 작가의 기능을 확장하는 것입니다
type CounterWr struct {
io.Writer
Count int
}
func (cw *CounterWr) Write(p []byte) (n int, err error) {
n, err = cw.Writer.Write(p)
cw.Count += n
return
}
이 CounterWr
유형은 자동으로 Count
필드에 기록 된 바이트의 수를 관리하는 언제든지 확인/검토 할 수 있습니다.
json.NewEncoder()
이
CounterWr
값을 전달하는
io.Writer
을 통과하는 우리의
CounterWr
의 가치를 창출하고, 직접
CounterWr.Count
에서 기록 된 바이트 수를 액세스 할 수 있습니다.
사용 예제 : 검증 목적
type Something struct {
S string
I int
}
buf := &bytes.Buffer{}
// Any writer, not just a buffer!
var out io.Writer = buf
cw := &CounterWr{Writer: out}
s := Something{"hello", 4}
if err := json.NewEncoder(cw).Encode(s); err != nil {
panic(err)
}
fmt.Printf("Count: %d bytes, %d bits\n", cw.Count, cw.Count*8)
fmt.Printf("Verif: %d bytes, %d bits\n", buf.Len(), buf.Len()*8)
우리는 또한 우리가 우리의 출력으로 사용되는 bytes.Buffer
의 길이를 인쇄하고 (CounterWr.Count
및 Buffer.Len()
는 일치해야합니다).
출력 :
Count: 20 bytes, 160 bits
Verif: 20 bytes, 160 bits
IT는 Go Playground에보십시오.
주 :
너무 다른 값을 인코딩하는 경우 cw.Count
총 물론 바이트 수 (그리고 그냥 마지막 값)입니다. 마지막으로 인코딩 된 값의 크기 만 가져 오려면 Encoder.Encode()
을 호출하기 전에 cw.Count
을 저장하고 인코딩 한 후 얻은 값의 차이를 계산하십시오. 당신은 무엇을
cw.Count = 0
을 시도 :하거나 (예, 당신은 또한 해당 필드를 변경할 수 있습니다) 인코딩하기 전에
0
-cw.Count
을 설정? 내장 된'len'을 사용하여 문자열, 슬라이스, 맵, 버퍼링 된 채널의 길이를 얻습니다. – JimBobjectInJson, 오류 : = json.Marshal (object); len (objectInJson)은 잘 작동합니다. 하지만 나는 json을 사용하지 않는 편이 좋을 것입니다. 저는 json을 사용하면서 장군님. 다른 목적으로 사용하십시오. json에서 문자열 길이를 얻고 싶습니다. 어떻게 든 인코딩하십시오. – user1283776
'json.Encoder'를 사용한다면, 무엇을 쓰고 있습니까? 버퍼에 쓰고 길이를 확인해 주시겠습니까? – JimB