[ProtocolBuffer] ํ๋กํ ์ฝ ๋ฒํผ bytes ํ๋๋ฅผ json ๋ณํ ์ ์ฃผ์ ํ ์
ํ๋กํ ์ฝ ๋ฒํผ์์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ๋ฉ์ธ์ง๋ฅผ jsonํ์ ์ผ๋ก ๋ณํ ํ ๋ bytes ํ๋์ ๋ํด ์ฃผ์ ํ ์ ์ด ์๋ค.
์ผ๋ฐ์ ์ธ string ํ์ ์ ์ ๋ ฅํ ๋ฌธ์์ด์ ์ฐ๋ฆฌ๊ฐ ์๋ํ ๋๋ก json ๋ณํ์์๋ ์ ์ง๋ฅผ ํ๊ณ ์์ง๋ง,
bytes ํ์ ์ ์ ๋ ฅํ ๋ฌธ์์ด์ json์ผ๋ก ๋ณํ ์ ๊ทธ๋๋ก ์ ์ง๋์ง ์๋๋ค.
๊ฐ๋จํ ํ ์คํธ๋ฅผ ์ํด Go์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์งํํ์๋ค.
[user.proto]
syntax = "proto3";
package message;
message User {
int64 userId = 1;
string nickname = 2;
bytes danmoji = 3;
}
๋ฉ์ธ์ง์ ํฌ๋งท์ ์์ ๊ฐ๋ค. ์ด์ stringํ์ ์ธ nicknameํ๋์, bytesํ์ ์ธ danmojiํ๋์ ๋ฌธ์์ด์ ์ฑ์ ๋ฉ์ธ์ง๋ฅผ ๋ง๋ค๊ณ json ํ์ ์ผ๋ก ๋ณํ์ ํด๋ณด์.
[์์ 1] User ๋ฉ์ธ์ง๋ฅผ json์ผ๋ก ๋ณํ
import (
"fmt"
"github.com/golang/protobuf/jsonpb"
"testing"
)
func TestMessageToJson(t *testing.T) {
// User ๋ฉ์ธ์ง ์ ์
userInfo := &User{
UserId: 1,
Nickname: "test",
Danmoji: []byte("test"),
}
// json ๋ณํ
jsonString, _ := (&jsonpb.Marshaler{}).MarshalToString(userInfo)
fmt.Println(jsonString)
}
=== RUN TestMessageToJson
{"userId":"1","nickname":"test","danmoji":"dGVzdA=="}
--- PASS: TestMessageToJson (0.00s)
PASS
Process finished with exit code 0
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด nickname์ ์ ์์ ์ผ๋ก ๋ณํ๋์์ง๋ง, danmoji๋ ์ด์ํ ๋ฌธ์๋ค๋ก ์ฑ์์ ธ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฐ๋๋ก jsonํ์ ์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ๋ฉ์ธ์ง๋ก ๋ณํํ ๋์ ์์ด๋ ์ด๋ฐ ์์ผ๋ก ์ ๋ ฅํ๋ฉด ์ ๋๋ค๋ ๊ฒ์ด๋ค.
[์์ 2] json ๋ฉ์ธ์ง๋ฅผ Userํ์ ์ผ๋ก ๋ณํ
import (
"fmt"
"github.com/golang/protobuf/jsonpb"
"testing"
)
func TestJsonToMessage(t *testing.T) {
// json ๋ฉ์ธ์ง ์ ์
jsonMessage := "{\"userId\":\"1\",\"nickname\":\"test\",\"danmoji\":\"test\"}"
// ๋ฉ์ธ์ง๋ก ๋ณํ
var userInfo User
_ = jsonpb.UnmarshalString(jsonMessage, &userInfo)
fmt.Println(userInfo)
fmt.Println("danmoji: ", string(userInfo.Danmoji))
}
=== RUN TestJsonToMessage
{1 test [181 235 45] {} [] 0}
danmoji: ๏ฟฝ๏ฟฝ-
--- PASS: TestJsonToMessage (0.00s)
PASS
๊ฒฐ๊ณผ์์ ๋ณผ ์ ์๋ฏ์ด danmoji๋ฅผ string์ผ๋ก ๋ณํํ๋๋ฐ ์ด์ํ ๊ฐ์ด ์ฐํ๊ณ ์๋ค.
๊ฒฐ๋ก ์ ๋งํ์๋ฉด,
- json -> protobuf message, protobuf message -> json ์ผ๋ก ๋ณํ ์ bytes ํ๋๋ ์กฐ๊ธ ๋ค๋ฅธ ํํ๋ก parsing ๋๋ค.
- ๋ด๋ถ์ ์ผ๋ก base64 encoding๋ฅผ ๊ฑฐ์ณ ๋ณํ๋๋ค.
[์์ 3] Base64 Encoding์ ํตํด json ๋ฉ์ธ์ง๋ฅผ Userํ์ ์ผ๋ก ๋ณํ
import (
"fmt"
"github.com/golang/protobuf/jsonpb"
"testing"
)
func TestJsonToMessageBase64(t *testing.T) {
// json ๋ฉ์ธ์ง ์ ์
dmj := base64.StdEncoding.EncodeToString([]byte("test"))
jsonMessage := "{\"userId\":\"1\",\"nickname\":\"test\",\"danmoji\":\"" + dmj +"\"}"
// ๋ฉ์ธ์ง๋ก ๋ณํ
var userInfo User
_ = jsonpb.UnmarshalString(jsonMessage, &userInfo)
fmt.Println(userInfo)
fmt.Println("danmoji: ", string(userInfo.Danmoji))
}
=== RUN TestJsonToMessageBase64
{1 test [116 101 115 116] {} [] 0}
danmoji: test
--- PASS: TestJsonToMessageBase64 (0.00s)
PASS
protobuf message -> json์ผ๋ก ๋ณํ ์, bytesํ๋๋ base64 encoding๋์ด ๊ฐ์ด ๋ค์ด๊ฐ๊ณ
๋ฐ๋๋ก, json -> protobuf message๋ก ๋ณํ ์ base64 decoding๋์ด ๋ฉ์ธ์ง ํ๋์ ๋ค์ด๊ฐ๋ค.
์ฐ๋ฆฌ๊ฐ ํ ์คํธ๋ฅผ ์ํด json ๋ฉ์ธ์ง๋ฅผ ์๋ฒ์ ๋ณด๋ด๊ณ ์๋ฒ์์ json ๋ฉ์ธ์ง๋ฅผ ์ ์์ ์ผ๋ก ๋ณํํ๊ธฐ ์ํด์๋
- json ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ๋ bytesํ๋๋ง base64 encoding์ ํด์ ๋ณด๋ธ๋ค.
- ํน์ ์ฌ์ฉ์๋ ๊ทธ๋๋ก json ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋, json ๋ฉ์ธ์ง์ bytesํ๋๋ง ์๋ฒ์์ base64 encoding์ ํ ๋ฒ ํ๊ณ , protobuf ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ ์ฒด์ ์ผ๋ก Unmarshalingํ๋ค.
์ฌ์ฉ์๊ฐ ์ผ์ผํ bytes ํ๋์๋ง base64 encoding์ ํด์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ํ ์คํธ๋ฅผ ํ๊ธฐ์๋ ๋ฒ๊ฑฐ๋กญ๋ค.
๋ฐ๋ผ์ ์๋ฒ์์ ์ฒ๋ฆฌํ๋์ชฝ์ด ๋ ํธ๋ฆฌํ์ง ์์๊น ์๊ฐ๋๋ค.
'ETC > Protocol Buffer' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Protocol Buffer] Child Directory์์ Parent Directory ํ๋กํ ํ์ผ Import (0) | 2019.08.02 |
---|---|
[Protocol Buffer] ํ๋กํ ์ฝ ๋ฒํผ ์ค์นํ๊ธฐ (Windows) (3) | 2019.06.23 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Protocol Buffer] Child Directory์์ Parent Directory ํ๋กํ ํ์ผ Import
[Protocol Buffer] Child Directory์์ Parent Directory ํ๋กํ ํ์ผ Import
2019.08.02 -
[Protocol Buffer] ํ๋กํ ์ฝ ๋ฒํผ ์ค์นํ๊ธฐ (Windows)
[Protocol Buffer] ํ๋กํ ์ฝ ๋ฒํผ ์ค์นํ๊ธฐ (Windows)
2019.06.23