2016-01-11 25 views
8

Sto usando google grpc con un proxy json. per qualche motivo ho bisogno di rimuovere i tag omitempty dalla struttura generata nei file * .pb.go.golang protobuf rimuove il tag omitempty dai tag json generati

se ho un messaggio come questo proto

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

La struct generato assomiglia a questo

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"` 
} 

Ma mia necessità è quella di rimuovere il tag omitempty dalle struct generati. Come posso fare questo?

+0

avete bisogno che il proto-buf funzioni bene? proto-buf ha bisogno dei tag. –

+0

la cosa è @JiangYD, sto inviando un valore 0 con uno dei miei int fild. ma quando invio un valore 0 il grpc-gateway omette il valore. so che ci sono altri approcci, ma mi piacerebbe sapere come posso rimuovere un tag ometto vuoto. – sadlil

+0

@Sadlil Non sono sicuro di aver capito il tuo problema. Se invii un valore '0', verrà omesso e quindi il campo rimarrà invariato - lasciando correttamente con valore' 0' se hai usato una struttura a valore zero (che dovresti comunque). – icza

risposta

0

ho scoperto che il tag omitempty JSON è hard-coded nel ProtoC-gen-go source attorno alla riga 1778:

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

sarà facile cambiare la fonte e fare una nuova ProtoC-gen-go binario te stesso.

Vale la pena notare che questo è probabile sconsigliabile e non raccomandato per diversi motivi, in particolare perché sarà quindi la responsabilità di assicurare che il hacked fino binario sempre si abitua se i protobufs bisogno di essere rigenerato.

2

A [più] soluzione portatile:

Usa sed a nudo i tag dopo aver generato tramite protoc.

esempio di quello che in realtà uso nel mio go: generare script dopo aver generato i file * .pb.go:

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

Nota: sed -i (inline-sostituzione) non viene utilizzato qui perché quel flag non è portabile tra OS-X standard e Linux.

0

è possibile copiare il pacchetto di codifica/json nella propria cartella, ad esempio my_json, e modificare il campo omitEmpty su falso e utilizzare my_json.Marshal() per codificare la struttura in stringa json.