larksuite/cli · error
expected string key, got %v
Error message
expected string key, got %v
What it means
While iterating the object's key/value pairs in OrderedMap.UnmarshalJSON, each key token must be a JSON string. A non-string key token (only possible with malformed or exotic input) triggers this error, protecting the map[string]Property backing store.
Source
Thrown at internal/schema/types.go:167
func (o *OrderedProps) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
tok, err := dec.Token()
if err != nil {
return err
}
if delim, ok := tok.(json.Delim); !ok || delim != '{' {
return fmt.Errorf("expected object, got %v", tok)
}
o.Order = nil
o.Map = make(map[string]Property)
for dec.More() {
keyTok, err := dec.Token()
if err != nil {
return err
}
key, ok := keyTok.(string)
if !ok {
return fmt.Errorf("expected string key, got %v", keyTok)
}
var prop Property
if err := dec.Decode(&prop); err != nil {
return err
}
o.Order = append(o.Order, key)
o.Map[key] = prop
}
if _, err := dec.Token(); err != nil {
return err
}
return nil
}
View on GitHub (pinned to 7fd6ef3c07)
Solutions
- Validate the JSON payload parses cleanly with a standard decoder before consuming tokens
- Verify input has not been truncated or corrupted in transit
- Check that no other reader consumed tokens from the same decoder/stream beforehand
Example fix
// before
tok, _ := dec.Token(); use(tok.(int))
// after
keyTok, err := dec.Token()
if err != nil { return err }
if k, ok := keyTok.(string); !ok { return fmt.Errorf("expected string key, got %v", keyTok) } else { _ = k } Defensive patterns
Strategy: try-catch
Validate before calling
var probe map[string]json.RawMessage
if err := json.Unmarshal(data, &probe); err != nil {
return fmt.Errorf("payload is not a valid JSON object: %w", err)
} Try / catch
if err := json.Unmarshal(data, &om); err != nil {
if strings.Contains(err.Error(), "expected string key") {
// treat input as corrupted; re-fetch or use defaults
}
return err
} Prevention
- Sanity-check payloads with a standard decode before streaming tokens
- Guard against truncated/corrupted transfer (checksums, length checks)
- Don't share decoders/streams between readers
When it happens
Trigger: Decoding JSON where a key token decoded via dec.Token() is not a string. Standard JSON only permits string keys, so this typically fires on hand-crafted or corrupted input streams, or when the decoder position is misaligned (e.g. input mutated between tokens).
Common situations: Corrupted or truncated JSON streams; custom decoder pipelines that feed tokens out of order; fuzzed input to schema parsing.
Related errors
- expected object, got %v
- lark-cli returned a non-object JSON payload
- parse base schema for field overrides: %w
- serialize schema with field overrides: %w
- marshal key %q: %w
AI-assisted analysis of larksuite/cli@7fd6ef3c07 (2026-09-04).
Data as JSON: /api/errors/c9af8e91506a2b5f.
Report an issue: GitHub.