>백엔드 개발 >Golang >Go에서 중첩된 JSON을 객체 배열로 역마샬링하는 방법은 무엇입니까?

Go에서 중첩된 JSON을 객체 배열로 역마샬링하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-25 10:59:14368검색

How to Unmarshal Nested JSON into an Array of Objects in Go?

Go에서 중첩된 JSON을 객체 배열로 역마샬링

문제

다음 JSON 데이터를 고려하세요.

{
   "1001":{
      "level":10,
      "monster-id":1001,
      "skill-level":1,
      "aimer-id":301
   },
   "1002":{
      "level":12,
      "monster-id":1002,
      "skill-level":1,
      "aimer-id":302
   },
   "1003":{
      "level":16,
      "monster-id":1003,
      "skill-level":2,
      "aimer-id":303
   }
}

목표는 이 JSON을 Monster 배열로 역마샬링하는 것입니다. 개체.

type Monster struct {
    MonsterId  int32
    Level      int32
    SkillLevel int32
    AimerId    int32
}

솔루션

이를 달성하려면 다음 단계를 따르세요.

  1. MonsterCollection 정의: 보유할 MonsterCollection 유형을 만듭니다. 문자열이 포함된 몬스터 개체 지도 키.
type MonsterCollection struct {
    Pool map[string]Monster
}
  1. FromJson 메서드 구현: 역마샬링을 처리하려면 MonsterCollection 유형에 FromJson 메서드를 정의합니다.
func (mc *MonsterCollection) FromJson(jsonStr string) error {
    var data *map[string]Monster
    b := []byte(jsonStr)
    return json.Unmarshal(b, &data)
}
  • var 데이터 사용 *map[string]Monster 회피 인터페이스{}를 사용하여 결과 지도가 원하는 유형인지 확인합니다.
  • 데이터를 포인터로 전달하면 역마샬링 중에 변경된 내용이 MonsterCollection의 Pool 필드에 반영됩니다.
  1. 풀의 올바른 키 유형: 풀 맵의 키 유형을 문자열로 변경하여 JSON 데이터.
  2. 구조체 태그 사용: Monster 구조에 JSON 구조 태그를 추가하여 JSON 데이터의 필드 이름을 지정합니다.
type Monster struct {
    MonsterId  int32 `json:"monster-id"`
    Level      int32 `json:"level"`
    SkillLevel int32 `json:"skill-level"`
    AimerId    int32 `json:"aimer-id"`
}
  1. FromJson 호출: JSON 문자열을 사용하여 FromJson 메서드를 호출하여 데이터를 비정렬화합니다. MonsterCollection에 추가합니다.
mc := new(MonsterCollection)
err := mc.FromJson(jsonStr)
  1. 오류 확인: 디버깅 목적으로 FromJson에서 반환한 오류를 처리합니다.
  2. 액세스 개체: 개별 몬스터에 액세스하려면 MonsterCollection의 Pool 필드를 사용하세요.
for id, monster := range mc.Pool {
    fmt.Println(id, monster)
}

이 단계를 따르면 중첩된 JSON 데이터를 Go의 Monster 개체 배열로 성공적으로 역마샬링할 수 있습니다.

위 내용은 Go에서 중첩된 JSON을 객체 배열로 역마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.