2016-01-11 10 views
8

Używam google grpc z json proxy. z jakiegoś powodu muszę usunąć tagi omitempty ze struktury wygenerowanej w plikach * .pb.go.golang protobuf remove tag omitempty z wygenerowanych znaczników json

jeśli mam wiadomość proto jak ten

message Status { 
    int32 code = 1; 
    string message = 2; 
} 

wygenerowanym struktury wygląda następująco

type Status struct { 
    Code int32 `protobuf:"varint,1,opt,name=code" json:"code,omitempty"` 
    Message string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` 
} 

ale moja potrzeba, aby usunąć tag omitempty z generowanych elemencie. Jak mogę to zrobić?

+0

Czy potrzebujesz działającego proto-buf? proto-buf potrzebuje tagów. –

+0

rzecz jest @JiangYD, wysyłam wartość 0 z jednym z moich int fe feild. ale gdy wysyłam wartość 0 bramka grpc pomija wartość. Wiem, że istnieją inne podejście, ale chciałbym wiedzieć, jak mogę usunąć pominąć pusty tag. – sadlil

+0

@Slady Nie jestem pewien, czy rozumiem twój problem. Jeśli wyślesz wartość "0", zostanie ona pominięta, a więc pole pozostanie niezmienione - poprawnie pozostawiając wartość "0", jeśli użyłeś struktury o wartości zerowej (co i tak powinieneś). – icza

Odpowiedz

0

okazało się, że tag omitempty json jest zakodowane w protoc-gen-go source wokół linii 1778:

tag := fmt.Sprintf("protobuf:%s json:%q", 
    g.goTag(message, field, wiretype), jsonName+",omitempty") 

będzie łatwo zmienić źródła i stworzyć nowy protoc-gen-go binary się.

Warto zauważyć, że jest to prawdopodobnie niewskazane i nie jest zalecane z kilku powodów, przede wszystkim dlatego, wtedy będziesz odpowiedzialny za zapewnienie, że włamał się binarny zawsze przyzwyczaja jeśli protobufs muszą być regenerowane.

2

A [więcej] Przenośny rozwiązanie:

Zastosowanie sed rozebrać znaczniki po wygenerowaniu przez protoc.

Przykład tego, co ja właściwie używać w ruchu: generowania skryptu Po wygenerowaniu plików * .pb.go:

ls *.pb.go | xargs -n1 -IX bash -c 'sed s/,omitempty// X > X.tmp && mv X{.tmp,}' 

Uwaga: sed -i (inline-wymiana) nie jest tutaj, ponieważ używane ta flaga nie jest przenośna między standardowymi OS-X i Linux.

0

można skopiować pakiet kodowania/json do własnego folderu, na przykład my_json i modyfikować omitEmpty pole false i używać my_json.Marshal() do zakodowania struct do json ciąg.

Powiązane problemy