{"record":{"id":"da4af1093eb8f36a","repo":"hyperledger/fabric","slug":"list-already-open-must-close-list-before-starting","errorCode":null,"errorMessage":"list already open, must close list before starting a new one","messagePattern":"list already open, must close list before starting a new one","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/ledgerutil/jsonrw/json_read_write.go","lineNumber":147,"sourceCode":"\tif reflect.TypeOf(v).Kind() == reflect.Slice {\n\t\terr = w.OpenList()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\terr = w.encoder.Encode(v)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Open a json list\nfunc (w *JSONFileWriter) OpenList() error {\n\tif w.listOpened {\n\t\treturn errors.Errorf(\"list already open, must close list before starting a new one\")\n\t}\n\n\tw.listOpened = true\n\tw.count = 0\n\t_, err := w.buffer.Write([]byte(\"[\\n\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Close a json list\nfunc (w *JSONFileWriter) CloseList() error {\n\tif !w.listOpened {\n\t\treturn errors.Errorf(\"no list open, cannot close list\")\n\t}\n","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/ledgerutil/jsonrw/json_read_write.go#L129-L165","documentation":"JSON lists follow the same discipline as objects: OpenList flips a listOpened flag and writes '['. A second OpenList while a list is still open is rejected, since the writer cannot represent a nested bare list without an entry mechanism and enforces one open list at a time.","triggerScenarios":"Calling OpenList twice without CloseList, typically when OpenList sits inside a loop or when an entry loop also calls OpenList per item.","commonSituations":"Refactored code writing nested lists, or a forgotten CloseList when switching from one list to another in the same file.","solutions":["Call CloseList before starting a new list","Move OpenList out of loops that write multiple entries","Close the list before opening an object for the next section"],"exampleFix":"// before\nw.OpenList()\nfor _, e := range entries { w.OpenList() }\n// after\nw.OpenList()\nfor _, e := range entries { w.AddEntry(e) }\nw.CloseList()","handlingStrategy":"validation","validationCode":"type listTracker struct{ listOpen bool }","typeGuard":"func canOpenList(listOpened bool) bool { return !listOpened }","tryCatchPattern":"if err := w.OpenList(); err != nil {\n\treturn fmt.Errorf(\"open list: %w\", err)\n}\ndefer func() {\n\tif err := w.CloseList(); err != nil { log.Error(err) }\n}()","preventionTips":["Pair every OpenList with one CloseList","Never call OpenList inside an entry-writing loop","Track list state locally for nested/sequential sections","Check return values of OpenList/CloseList"],"tags":["hyperledger-fabric","json","state-machine","api-misuse"],"backgroundTag":"json-writer-list-already-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"}