hyperledger/fabric · error

no object open, cannot add field

Error message

no object open, cannot add field

What it means

AddField appends key/value pairs to the currently open JSON object. Fields may only exist inside an object, so when objectOpened is false the writer refuses to emit a field that would produce invalid JSON.

Source

Thrown at internal/ledgerutil/jsonrw/json_read_write.go:111

		return errors.Errorf("no object open, cannot close object")
	}

	_, err := w.buffer.Write([]byte("}\n"))
	if err != nil {
		return err
	}

	w.objectOpened = false
	w.firstFieldWritten = false

	return nil
}

// Add field to an open json object
func (w *JSONFileWriter) AddField(k string, v any) error {
	// Need to open object before adding fields
	if !w.objectOpened {
		return errors.Errorf("no object open, cannot add field")
	}
	// Add commas for fields after the first field in the object
	if w.firstFieldWritten {
		_, err := w.buffer.Write([]byte(",\n"))
		if err != nil {
			return err
		}
	} else {
		w.firstFieldWritten = true
	}
	// Key : Value
	keyString := fmt.Sprintf("\"%s\":", k)
	_, err := w.buffer.Write([]byte(keyString))
	if err != nil {
		return err
	}
	// Determine if v is list
	if reflect.TypeOf(v).Kind() == reflect.Slice {

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Wrap AddField calls between OpenObject and CloseObject
  2. Move AddField calls inside the object-open region
  3. For top-level data, open a single object for the whole file first

Example fix

// before
w.AddField("count", 1) // errors: no object open
// after
w.OpenObject()
w.AddField("count", 1)
w.CloseObject()
Defensive patterns

Strategy: validation

Validate before calling

func requireObjectOpen(opened bool) error {
	if !opened { return errors.New("AddField requires an open object: call OpenObject first") }
	return nil
}

Type guard

func canAddField(objectOpened bool) bool { return objectOpened }

Try / catch

if err := w.OpenObject(); err != nil { return err }
if err := w.AddField("key", val); err != nil { return err }
if err := w.CloseObject(); err != nil { return err }

Prevention

When it happens

Trigger: Calling AddField before any OpenObject, or after CloseObject has already closed the current object.

Common situations: Writing a flat sequence of fields at top level (top level of the file is not an implicit object), or adding fields after closing an object in a loop.

Related errors


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/d09bab496c2f387e. Report an issue: GitHub.