내 웹 소켓 서버는 JSON 데이터를 수신하고 마샬링 해제합니다. 이 데이터는 항상 키 / 값 쌍이있는 개체에 래핑됩니다. 키 문자열은 값 식별자 역할을하여 Go 서버에 어떤 종류의 값인지 알려줍니다. 어떤 유형의 값을 알면 올바른 유형의 구조체로 값을 정렬 해제하는 JSON으로 진행할 수 있습니다.
각 json- 객체에는 여러 키 / 값 쌍이 포함될 수 있습니다.
예제 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)
}
어떤 종류의 제안 / 도움을 주셔서 감사합니다!
답변
이것은 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-
답변
Stephen Weinberg의 대답에 더해 , 나는 기존 객체에 데이터를 쉽게 채우고 기존 객체를 JSON 문자열로 인코딩하는 데 도움이되는 iojson 이라는 편리한 도구를 구현했습니다 . 다른 미들웨어와 함께 작동하도록 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
답변
비슷한 일을하는 우아한 방법이 있습니다. 하지만 왜 부분적으로 JSON을 비 정렬 화 하는가? 말이 안 돼.
- 채팅에 대한 구조를 만듭니다.
- json을 구조체로 디코딩합니다.
- 이제 Struct / 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
}
}