programing

Go에서 JSON을 지도에 부분적으로 삽입 해제

stoneblock 2023. 2. 23. 21:59

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의 마샬이 해제되는가?그것은 말이 안됩니다.

  1. 채팅 구조를 만듭니다.
  2. 구조체에 json을 디코딩합니다.
  3. 이제 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