Protocol buffers are raw json pole

hknmtt

Protocol buffers are raw json pole
« kdy: 09. 12. 2022, 17:42:58 »
Mam json string ktory chcem predat v surovej forme ako pole v PB sprave ktora sa serializuje do jsonu. Problem je ze ked pouzijem bytes typ pre to pole tak vo vysledku my json vypluje spravu s tymto polom ako hex string. Ked pouzijem string typ tak to bude zas escapovany json.

Aktualne teda pouzivam Struct known typ kedy vsak ale musim naparsovat ten surovy json na tuto spravu a tu potom zase vie PB serializovat uz spravne ako objekt. Je to zbytocny krok ktoremu by som sa chcel vyhnut. Matne si spominam ze som v minulosti pouzil nejaky field tag/option pre pole kam som chcel dat  surovy json aby ho parser nechal tak, lenze to uz neviem najst momentalne. Tak ze ci nahodou niekto neviete o nejakom rieseni? Proto 3, Go jazyk. Ide len o serializovanie pre response zo serveru, takze nejde o input dat.


Re:Protocol buffers are raw json pole
« Odpověď #1 kdy: 09. 12. 2022, 22:27:04 »
Jde to tam naohejbat se starou implementací.

```
// foo.proto
message Foo {
  RawJSONMessage bar = 1;
}

message RawJSONMessage {
  string value = 1;
}
```
```
// foo.go
import "github.com/golang/protobuf/jsonpb"

// MarshalJSONPB overrides how the Bar, protobuf generated struct, is being serialized to JSON.
func (b *Bar) MarshalJSONPB(*jsonpb.Marshaler) ([]byte, error) {
   return []byte(b.Val), nil
}
```
```
// foo_test.go
import (
   "testing"
   "github.com/golang/protobuf/jsonpb"
)

func TestFoo(t *testing.T) {
   f := &Foo{
      Bar: &Bar{
         Val: `{"foo":"bar"}`,
      },
   }
   s, err := (&jsonpb.Marshaler{}).MarshalToString(f)
   if err != nil {
      t.Fatal(err)
   }
   t.Log(s)
}
```

Každopádně ta opravdová odpověď leží zde:
https://pkg.go.dev/github.com/golang/protobuf/jsonpb#JSONPBMarshaler

hknmtt

Re:Protocol buffers are raw json pole
« Odpověď #2 kdy: 10. 12. 2022, 00:51:11 »
Hej, to je tiez riesenie.

Re:Protocol buffers are raw json pole
« Odpověď #3 kdy: 10. 12. 2022, 07:40:41 »
Nebylo by jednodušší nepoužít protobuf? Když ho stejně pak převádíš na JSON a chceš do něj dávat něco, co nemá pevný schéma, tak vlastně nevyužiješ skoro nic z toho, co umí...

hknmtt

Re:Protocol buffers are raw json pole
« Odpověď #4 kdy: 22. 12. 2022, 15:51:03 »
Pouzil som tomasov postup, ktory fungoval ako som chcel. Najlahsie riesenie. Ale chcem prejst z nativneho github.com/golang/protobuf na google.golang.org/protobuf, kedze je to aj odporucane, ale problem je ze tam nie je ziaden JSONPBMarshaler interfejs, takze zase mam escapovany json alebo base64 string, podla toho ci pouzijem string alebo bytes typ. A neviem zatial najst riesenie.


Re:Protocol buffers are raw json pole
« Odpověď #5 kdy: 25. 12. 2022, 21:56:56 »
Ale chcem prejst z nativneho github.com/golang/protobuf na google.golang.org/protobuf, kedze je to aj odporucane, ale problem je ze tam nie je ziaden JSONPBMarshaler interfejs, takze zase mam escapovany json alebo base64 string, podla toho ci pouzijem string alebo bytes typ. A neviem zatial najst riesenie.
Každopádně ta opravdová odpověď leží zde:
https://pkg.go.dev/github.com/golang/protobuf/jsonpb#JSONPBMarshaler
```
type JSONPBMarshaler
Deprecated: Custom types should implement protobuf reflection instead.
```

Budeš se muset ponořit do reflexe. Alternativně vlastní parser.
Každopádně to celé smrdí na 100 honů.
https://en.wikipedia.org/wiki/Code_smell