2016-06-08 2 views
-1

개체가 있습니다.을 사용하여 json으로 객체를 인코딩합니다.크기가 JSON으로 인코딩 된 객체의 비트 수입니까?

두 비트 모두에서 json 문자열의 크기를 측정하려면 어떻게해야합니까?

+0

을 시도 :하거나 (예, 당신은 또한 해당 필드를 변경할 수 있습니다) 인코딩하기 전에 0-cw.Count을 설정? 내장 된'len'을 사용하여 문자열, 슬라이스, 맵, 버퍼링 된 채널의 길이를 얻습니다. – JimB

+0

objectInJson, 오류 : = json.Marshal (object); len (objectInJson)은 잘 작동합니다. 하지만 나는 json을 사용하지 않는 편이 좋을 것입니다. 저는 json을 사용하면서 장군님. 다른 목적으로 사용하십시오. json에서 문자열 길이를 얻고 싶습니다. 어떻게 든 인코딩하십시오. – user1283776

+0

'json.Encoder'를 사용한다면, 무엇을 쓰고 있습니까? 버퍼에 쓰고 길이를 확인해 주시겠습니까? – JimB

답변

1

io.Writerjson.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.CountBuffer.Len()는 일치해야합니다).

출력 :

Count: 20 bytes, 160 bits 
Verif: 20 bytes, 160 bits 

IT는 Go Playground에보십시오.

주 :

너무 다른 값을 인코딩하는 경우 cw.Count 총 물론 바이트 수 (그리고 그냥 마지막 값)입니다. 마지막으로 인코딩 된 값의 크기 만 가져 오려면 Encoder.Encode()을 호출하기 전에 cw.Count을 저장하고 인코딩 한 후 얻은 값의 차이를 계산하십시오. 당신은 무엇을

cw.Count = 0 
관련 문제