Heim >Backend-Entwicklung >Golang >Wie entferne ich „omitempty'-Tags aus JSON in Protokollpufferstrukturen?

Wie entferne ich „omitempty'-Tags aus JSON in Protokollpufferstrukturen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-14 16:45:111001Durchsuche

How to Remove `omitempty` Tags from JSON in Protocol Buffer Structs?

So entfernen Sie das Omitempty-Tag aus generierten JSON-Tags in Protokollpufferstrukturen

In bestimmten Anwendungsfällen kann es erforderlich sein, das zu entfernen omitempty-Tag aus den JSON-Tags, die für Protokollpufferstrukturen generiert werden. Protokollpuffer sind, insbesondere wenn sie mit gRPC verwendet werden, ein leistungsstarkes Werkzeug für die Datenserialisierung und -übertragung. Die Einbeziehung des omitempty-Tags kann jedoch dazu führen, dass beim JSON-Marshalling Standard- oder Leerwerte weggelassen werden, was möglicherweise nicht wünschenswert ist.

Das Problem

Bei der Verwendung Wenn Sie Protokollpuffer mit einem JSON-Proxy verwenden, enthält die generierte Struktur möglicherweise omitempty-Tags, die in den JSON-Tags enthalten sind, wie im Beispiel zu sehen ist unten:

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

Die resultierende generierte Struktur:

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

Die Lösung

Um das omitempty-Tag aus den generierten Strukturen zu entfernen, klicken Sie hier Es gibt zwei mögliche Ansätze:

  1. Verwenden grpc-gateway: Wenn Sie grpc-gateway verwenden, können Sie den Servemux mit der folgenden Option konfigurieren:
gwmux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))
  1. Mit google.golang.org /protobuf/encoding/protojson: Für Anwendungen außerhalb von grpc-gateway können Sie die verwenden google.golang.org/protobuf/encoding/protojson-Paket anstelle des Standard-Encoding/json für das Marshalling. Dieses Paket bietet eine genauere Kontrolle über den Marshalling-Prozess, einschließlich der Möglichkeit, Standardwerte auszugeben:
func sendProtoMessage(resp proto.Message, w http.ResponseWriter) {
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    m := protojson.Marshaler{EmitDefaults: true}
    m.Marshal(w, resp) // You should check for errors here
}

Durch die Implementierung eines dieser Ansätze können Sie die omitempty-Tags effektiv aus den für generierten JSON-Tags entfernen Ihre Protokollpufferstrukturen, um sicherzustellen, dass beim JSON-Marshalling Standard- oder leere Werte enthalten sind.

Das obige ist der detaillierte Inhalt vonWie entferne ich „omitempty'-Tags aus JSON in Protokollpufferstrukturen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn