解组动态JSON,忽略已知字段

I am trying to unmarshal JSON of the following format:

{
  "fixedString": {
    "uselessStuff": {},
    "alsoUseless": {},

    "dynamicField": [
      { "name": "jack" }
    ],
    "dynamicToo": [
      { "name": "jill" }
    ]
  }
}

I would like to drop the fields "uselessStuff" and "alsoUseless", and get everything else. The other keys are user-defined and can take any value.

I can remove the fields I don't want using a custom UnmarshalJSON (based on this answer), but I have a feeling that this is unnecessarily complicated:

package main

import (
    "encoding/json"
    "fmt"
)

type Response struct {
    Things map[string]interface{} `json:"fixedString"`
}

type _R Response

func (f *Response) UnmarshalJSON(bs []byte) (err error) {
    foo := _R{}

    if err = json.Unmarshal(bs, &foo); err == nil {
        *f = Response(foo)
    }

    delete(f.Things, "uselessStuff")
    delete(f.Things, "alsoUseless")

    return err
}

func main() {
    j := []byte(`{ "fixedString": { "uselessStuff": {}, "alsoUseless": {}, "dynamicField": [ { "name": "jack" } ], "dynamicToo": [ { "name": "jill" } ] } }`)

    var r Response
    err := json.Unmarshal(j, &r)
    if err != nil {
        panic(err.Error())
    }

    for x, y := range r.Things {
        fmt.Println(x, y)
    }
}

Is there a way to ignore those two keys using annotations, rather than deleting them in a custom UnmarshalJSON function (and having to add the extra type alias _R to avoid a stack overflow)?

You could remove your "uselessStuff" and "alsoUseless" from the map and use them as unexported (lowercase) fields in your struct. Most likely not interface{}

json package ignores unexported fields

type Response struct {
    Things map[string]interface{} `json:"fixedString"`
    uselessStuff interface{}
    alsoUseless interface{}
}