1

システム間で Message 値を含む JSON をやり取りするのに苦労しています。もう少し進んだが、まだそこにはいない。構造体がその方法のようですが、送信している構造体は完全に問題ないように見えますが、サーバーが受信すると空になります。

ResultWeb ブラウザー (grpc-web) から Python バックエンドに渡されます。Python バックエンドはResult、(保存するために) JSON にシリアル化し、再び戻す必要があります。

// proto
message Result {
    google.protobuf.Struct variables = 1;
}

// obj - Where variables would contain a (1 level deep) JSON with different types of values, e.g.:
{
    "key1": 1,
    "key2": true,
    "key3": proto_msg_a //instance of proto.MessageA
}

// code
struct = new proto.google.protobuf.Struct(obj);
req = new Request;
req.variables = struct;

送信する前に確認するとreq.variables、実際にStruct正しいフィールドがすべて含まれていることがわかります。しかし、もう一方の端 (サーバー) が受信すると、それreq.variablesは空になりStructます。テスト目的で、obj単にを試してみました{'key': 'value'}が、結果は同じでした。

それで私は試しましたproto.google.protobuf.Struct.fromJavaScript

// code
struct = proto.google.protobuf.Struct.fromJavaScript(vars);
req = new Request;
req.variables = struct;

これは単純な場合obj(例: {"key": "val"}) に機能objしますが、プロト メッセージ フィールド (上記のような) がある場合は、次のようになります。

struct_pb.js:875 Uncaught Error: Unexpected struct type.
    at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:875)
    at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
    at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
    at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
    at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
    at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
    at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
    at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)

または、javascript で protobuf/json を使用してすべての問題を解決する代わりに、単にmap?

// proto
message Request {
    map<string, ?type?> variables = 1;
}

しかし?type?、値が何でもかまいません (proto.MessageX、文字列、ブール値など)。

変数で proto メッセージを使用したいと思います。protobuf/grpc を選択した理由はまさにこれで、完全なプラットフォーム全体で同じタイプを使用できるためですが、これがこの目標を妨げているようです。私は何か見落としてますか?あなたならどうしますか?

4

1 に答える 1