Go에서 JSON을 지도에 부분적으로 삽입 해제
웹 소켓 서버는 JSON 데이터를 수신하여 마샬링 해제합니다.이 데이터는 항상 키/값 쌍이 있는 개체로 래핑됩니다.key-string은 값 ID로 기능하여 Go 서버에 값의 종류를 알려줍니다.값의 유형을 알면 JSON으로 이동하여 값을 올바른 유형의 구조로 마샬링 해제할 수 있습니다.
각 json-object에는 여러 키/값 쌍이 포함될 수 있습니다.
예 JSON:
{
"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},
"say":"Hello"
}
이 기능을 사용하는 쉬운 방법으로 사용할 수 있는 방법은 없습니까?"encoding/json"
패키지가 필요합니까?
package main
import (
"encoding/json"
"fmt"
)
// the struct for the value of a "sendMsg"-command
type sendMsg struct {
user string
msg string
}
// The type for the value of a "say"-command
type say string
func main(){
data := []byte(`{"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},"say":"Hello"}`)
// This won't work because json.MapObject([]byte) doesn't exist
objmap, err := json.MapObject(data)
// This is what I wish the objmap to contain
//var objmap = map[string][]byte {
// "sendMsg": []byte(`{"user":"ANisus","msg":"Trying to send a message"}`),
// "say": []byte(`"hello"`),
//}
fmt.Printf("%v", objmap)
}
어떤 제안이나 도움을 주셔서 감사합니다!
이는 Unmarshaling을 통해 실현될 수 있습니다.map[string]json.RawMessage
.
var objmap map[string]json.RawMessage
err := json.Unmarshal(data, &objmap)
더 해석하려면sendMsg
그 후 다음과 같은 작업을 수행할 수 있습니다.
var s sendMsg
err = json.Unmarshal(objmap["sendMsg"], &s)
위해서say
, 같은 처리를 실시해, 스트링으로 마샬을 해제할 수 있습니다.
var str string
err = json.Unmarshal(objmap["say"], &str)
편집: sendMsg 구조의 변수를 올바르게 내보내기 위해 필요한 것도 유의하십시오.따라서 구조 정의는 다음과 같습니다.
type sendMsg struct {
User string
Msg string
}
예: https://play.golang.org/p/OrIjvqIsi4-
여기 비슷한 일을 할 수 있는 우아한 방법이 있다.하지만 왜 부분적으로 JSON의 마샬이 해제되는가?그것은 말이 안됩니다.
- 채팅 구조를 만듭니다.
- 구조체에 json을 디코딩합니다.
- 이제 Structure/Object의 모든 항목에 쉽게 액세스할 수 있습니다.
아래 작업 코드를 참조하십시오.복사하여 붙여넣습니다.
import (
"bytes"
"encoding/json" // Encoding and Decoding Package
"fmt"
)
var messeging = `{
"say":"Hello",
"sendMsg":{
"user":"ANisus",
"msg":"Trying to send a message"
}
}`
type SendMsg struct {
User string `json:"user"`
Msg string `json:"msg"`
}
type Chat struct {
Say string `json:"say"`
SendMsg *SendMsg `json:"sendMsg"`
}
func main() {
/** Clean way to solve Json Decoding in Go */
/** Excellent solution */
var chat Chat
r := bytes.NewReader([]byte(messeging))
chatErr := json.NewDecoder(r).Decode(&chat)
errHandler(chatErr)
fmt.Println(chat.Say)
fmt.Println(chat.SendMsg.User)
fmt.Println(chat.SendMsg.Msg)
}
func errHandler(err error) {
if err != nil {
fmt.Println(err)
return
}
}
Stephen Weinberg의 답변에 덧붙여, 저는 iojson이라고 하는 편리한 툴을 실장했습니다.iojson은 기존 오브젝트를 JSON 문자열로 인코딩할 뿐만 아니라 기존 오브젝트에 데이터를 쉽게 채울 수 있도록 도와줍니다.iojson 미들웨어는 다른 미들웨어와 연동하기 위해 제공됩니다.자세한 예는, https://github.com/junhsieh/iojson 를 참조해 주세요.
예:
func main() {
jsonStr := `{"Status":true,"ErrArr":[],"ObjArr":[{"Name":"My luxury car","ItemArr":[{"Name":"Bag"},{"Name":"Pen"}]}],"ObjMap":{}}`
car := NewCar()
i := iojson.NewIOJSON()
if err := i.Decode(strings.NewReader(jsonStr)); err != nil {
fmt.Printf("err: %s\n", err.Error())
}
// populating data to a live car object.
if v, err := i.GetObjFromArr(0, car); err != nil {
fmt.Printf("err: %s\n", err.Error())
} else {
fmt.Printf("car (original): %s\n", car.GetName())
fmt.Printf("car (returned): %s\n", v.(*Car).GetName())
for k, item := range car.ItemArr {
fmt.Printf("ItemArr[%d] of car (original): %s\n", k, item.GetName())
}
for k, item := range v.(*Car).ItemArr {
fmt.Printf("ItemArr[%d] of car (returned): %s\n", k, item.GetName())
}
}
}
샘플 출력:
car (original): My luxury car
car (returned): My luxury car
ItemArr[0] of car (original): Bag
ItemArr[1] of car (original): Pen
ItemArr[0] of car (returned): Bag
ItemArr[1] of car (returned): Pen
언급URL : https://stackoverflow.com/questions/11066946/partly-json-unmarshal-into-a-map-in-go
'programing' 카테고리의 다른 글
Visual Studio 코드의 JSX 또는 HTML 자동 완성 (0) | 2023.02.23 |
---|---|
장치 테스트 시 종속 서비스 주입 AngularJS 서비스 (0) | 2023.02.23 |
json_communications 함수: 특수 문자 (0) | 2023.02.23 |
Oracle에서 CLOB와 BLOB의 차이점을 이해할 수 있도록 지원 (0) | 2023.02.23 |
Oracle에서 사용자의 모든 권한을 표시하는 방법 (0) | 2023.02.23 |