Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: hknmtt 09. 12. 2022, 17:42:58

Název: Protocol buffers are raw json pole
Přispěvatel: hknmtt 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.
Název: Re:Protocol buffers are raw json pole
Přispěvatel: Tomáš Procházka 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
Název: Re:Protocol buffers are raw json pole
Přispěvatel: hknmtt 10. 12. 2022, 00:51:11
Hej, to je tiez riesenie.
Název: Re:Protocol buffers are raw json pole
Přispěvatel: snugar_i 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í...
Název: Re:Protocol buffers are raw json pole
Přispěvatel: hknmtt 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.
Název: Re:Protocol buffers are raw json pole
Přispěvatel: Tomáš Procházka 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