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

  1. Validate the JSON payload parses cleanly with a standard decoder before consuming tokens
  2. Verify input has not been truncated or corrupted in transit
  3. 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

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


AI-assisted analysis of larksuite/cli@7fd6ef3c07 (2026-09-04). Data as JSON: /api/errors/c9af8e91506a2b5f. Report an issue: GitHub.