"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How to Unmarshal Nested JSON into an Array of Objects in Go?

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

Published on 2024-12-21
Browse:256

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

Unmarshaling Nested JSON into Array of Objects in Go

Problem

Consider the following JSON data:

{
   "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
   }
}

The goal is to unmarshal this JSON into an array of Monster objects.

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

Solution

To achieve this, follow these steps:

  1. Define MonsterCollection: Create a MonsterCollection type to hold a map of Monster objects with string keys.
type MonsterCollection struct {
    Pool map[string]Monster
}
  1. Implement FromJson Method: Define a FromJson method on the MonsterCollection type to handle the unmarshaling.
func (mc *MonsterCollection) FromJson(jsonStr string) error {
    var data *map[string]Monster
    b := []byte(jsonStr)
    return json.Unmarshal(b, &data)
}
  • Using var data *map[string]Monster avoids the use of interface{}, ensuring that the resulting map has the desired type.
  • Passing data as a pointer ensures that the changes made during unmarshaling are reflected in the MonsterCollection's Pool field.
  1. Correct Key Type in Pool: Change the key type of the Pool map to string to match the keys in the JSON data.
  2. Use Struct Tags: Add JSON struct tags to the Monster struct to specify the field names in the JSON data.
type Monster struct {
    MonsterId  int32 `json:"monster-id"`
    Level      int32 `json:"level"`
    SkillLevel int32 `json:"skill-level"`
    AimerId    int32 `json:"aimer-id"`
}
  1. Call FromJson: Call the FromJson method with the JSON string to unmarshal the data into the MonsterCollection.
mc := new(MonsterCollection)
err := mc.FromJson(jsonStr)
  1. Check for Errors: Handle any errors returned by FromJson for debugging purposes.
  2. Access the Objects: Use the Pool field of the MonsterCollection to access the individual Monster objects.
for id, monster := range mc.Pool {
    fmt.Println(id, monster)
}

By following these steps, you can successfully unmarshal the nested JSON data into an array of Monster objects in Go.

Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3