{"record":{"id":"d09bab496c2f387e","repo":"hyperledger/fabric","slug":"no-object-open-cannot-add-field","errorCode":null,"errorMessage":"no object open, cannot add field","messagePattern":"no object open, cannot add field","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/ledgerutil/jsonrw/json_read_write.go","lineNumber":111,"sourceCode":"\t\treturn errors.Errorf(\"no object open, cannot close object\")\n\t}\n\n\t_, err := w.buffer.Write([]byte(\"}\\n\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tw.objectOpened = false\n\tw.firstFieldWritten = false\n\n\treturn nil\n}\n\n// Add field to an open json object\nfunc (w *JSONFileWriter) AddField(k string, v any) error {\n\t// Need to open object before adding fields\n\tif !w.objectOpened {\n\t\treturn errors.Errorf(\"no object open, cannot add field\")\n\t}\n\t// Add commas for fields after the first field in the object\n\tif w.firstFieldWritten {\n\t\t_, err := w.buffer.Write([]byte(\",\\n\"))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tw.firstFieldWritten = true\n\t}\n\t// Key : Value\n\tkeyString := fmt.Sprintf(\"\\\"%s\\\":\", k)\n\t_, err := w.buffer.Write([]byte(keyString))\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Determine if v is list\n\tif reflect.TypeOf(v).Kind() == reflect.Slice {","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/ledgerutil/jsonrw/json_read_write.go#L93-L129","documentation":"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.","triggerScenarios":"Calling AddField before any OpenObject, or after CloseObject has already closed the current object.","commonSituations":"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.","solutions":["Wrap AddField calls between OpenObject and CloseObject","Move AddField calls inside the object-open region","For top-level data, open a single object for the whole file first"],"exampleFix":"// before\nw.AddField(\"count\", 1) // errors: no object open\n// after\nw.OpenObject()\nw.AddField(\"count\", 1)\nw.CloseObject()","handlingStrategy":"validation","validationCode":"func requireObjectOpen(opened bool) error {\n\tif !opened { return errors.New(\"AddField requires an open object: call OpenObject first\") }\n\treturn nil\n}","typeGuard":"func canAddField(objectOpened bool) bool { return objectOpened }","tryCatchPattern":"if err := w.OpenObject(); err != nil { return err }\nif err := w.AddField(\"key\", val); err != nil { return err }\nif err := w.CloseObject(); err != nil { return err }","preventionTips":["Always open an object before the first AddField in a file","Keep AddField calls inside the OpenObject/CloseObject pair visually adjacent","Remember the top level of the file is not an implicit object"],"tags":["hyperledger-fabric","json","api-misuse"],"backgroundTag":"json-writer-no-object-open","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}