2017-10-26 1 views
1

protobuf를 사용하여 golang에 새 서비스를 작성하고 있습니다. .proto 파일에 다음 JSON 요청 모델을 작성하고 싶습니다.protobuf 정의로 JSON 배열을 모델링하는 방법

[ 
    { 
    "var": ["myVariable1","myVariable2"], 
    "key1": 123123, 
    "key2": 1122, 
    "key3": "abcd-0101" 
    }, 
    { 
    "var": ["myVariable1"], 
    "key1": 123124, 
    "key2": 1123, 
    "key3": "abcd-0102" 
    }, 
] 

현재 두 가지 문제가 있습니다 사전에 알 수없는 각 배열 요소에

  • 키, 따라서 나는 .proto 파일에 메시지를 작성하고 반복 할 수 없습니다가. 나는 그것을 지킬 필요가있다
  • 키가없는 배열 인 json을 모델링 할 수 없다. 매번 내가이, 다음과 같은 오류가 표시됩니다 음주 : JSON : 요청을 해독하는 데 실패

    syntax = "proto3"; 
    
    package pb; 
    
    import "google/protobuf/empty.proto"; 
    import "google/api/annotations.proto"; 
    
    service Transmitter { 
        rpc GetVariables(GetVariablesRequest) returns (GetVariablesResponse) { 
        option (google.api.http) = { 
           post: "/api/v1/{Service}/getVars" 
           body: "*" 
          }; 
        }; 
    } 
    
    
    message GetVariablesRequest { 
        string Service = 1; 
        repeated GetVarInput in = 2; 
    } 
    
    message GetVariablesResponse { 
        string msg = 1; 
    } 
    
    message GetVarInput { 
        map<string,string> Input = 2; 
    } 
    

    내가 대신 바이트 시도 : 수에 따라 이동 값

에 비 정렬 화되지 배열 내 .proto 파일입니다 반복 GetVarInput,하지만 항상 비어 있습니다. 또한 시체를 시도 : "*"및 본문 : "에서"

일부 포인터를 제공하십시오.

당신이처럼 JSON에 대한 메시지를 작성할 수
+0

캔트 방금 배열 당신의 JSON의 덩어리의 일부 자리의 이름을 :

message Any { string type = 1; bytes value = 2; } 

하고 GO 코드

? 예 : '{ "data": [{...}, {...}]}' –

답변

1

: 또한

message RequestMessage { 
    string var = 0; 
    double key1 = 1; 
    double key2 = 2; 
    string key3 = 3; 
} 

, 당신은 사티 암 Zode에 의한 대답은 것 같다 RequestMessage

message Request { 
    repeated RequestMessage request = 0; 
} 
0

의 배열을 포함하는 다른 메시지를 만들 수 있습니다 가장 합리적인 것.

원래 질문에서 JSON의 모든 유연성과 동적 특성을 유지하려고 시도 했으므로이 경우 protobuf로 변환하려고 시도하는 것은 의미가 없습니다. json을 포함하는 문자열 필드 만 가질 수 있습니다.

그러나 protobuf는 RequestMessage 내용에 대한 향후 변경 사항을 매우 잘 처리하므로 아직 최종 필드 집합을 알 필요가 없습니다. Updating a Message Type을 따라 다른 .proto 파일 버전간에 호환되도록하십시오.

1

또 다른 접근법은 .proto 파일에 Any 메시지를 사용하는 것입니다. 이 경우 필요한 모든 GO 유형으로 반복 맵을 가질 수 있습니다. 그러나이 방식은 강력한 형식의 프로그래밍 언어를 사용하여 유연성을 제공하므로 약간의 오버 헤드가 있습니다. 다음은 예입니다 :

func GetRPCAnyValue(value interface{}) *pb.Any { 
    bValue, type_val, _ := MarshlizeValue(value) 
    return &pb.Any{ 
     Type: type_val, 
     Value: bValue, 
    } 
} 
관련 문제