In Go Language, how do I unmarshal json to array of object?

后端 未结 2 1086
被撕碎了的回忆
被撕碎了的回忆 2021-01-02 06:12

I have the following JSON, and I want to parse it into array of class:

{
    \"1001\": {\"level\":10, \"monster-id\": 1001, \"skill-level\": 1, \"aimer-id\":         


        
相关标签:
2条回答
  • 2021-01-02 06:37

    Slightly off to one side - you asked for an array of objects when you needed a map

    If you need an array (actually a slice)

    http://ioblocks.blogspot.com/2014/09/loading-arrayslice-of-objects-from-json.html

    0 讨论(0)
  • 2021-01-02 06:50

    This code has many errors in it. To start with, the json isn't valid json. You are missing the commas in between key pairs in your top level object. I added the commas and pretty printed it for you:

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

    Your next problem (the one you asked about) is that m := data.(map[string]interface{}) makes m a map[string]interface{}. That means when you index it such as the v in your range loop, the type is interface{}. You need to type assert it again with v.(map[string]interface{}) and then type assert each time you read from the map.


    I also notice that you next attempt mc.Pool[i] = monster when i is an int and mc.Pool is a map[string]Monster. An int is not a valid key for that map.


    Your data looks very rigid so I would make unmarshall do most of the work for you. Instead of providing it a map[string]interface{}, you can provide it a map[string]Monster.

    Here is a quick example. As well as changing how the unmarshalling works, I also added an error return. The error return is useful for finding bugs. That error return is what told me you had invalid json.

    type Monster struct {
        MonsterId  int32 `json:"monster-id"`
        Level      int32 `json:"level"`
        SkillLevel int32 `json:"skill-level"`
        AimerId    int32 `json:"aimer-id"`
    }
    
    type MonsterCollection struct {
        Pool map[string]Monster
    }
    
    func (mc *MonsterCollection) FromJson(jsonStr string) error {
        var data = &mc.Pool
        b := []byte(jsonStr)
        return json.Unmarshal(b, data)
    }
    

    I posted a working example to goplay: http://play.golang.org/p/4EaasS2VLL

    0 讨论(0)
提交回复
热议问题