{"record":{"id":"53cd226cbbccdea9","repo":"larksuite/cli","slug":"invalid-escape-must-be-followed-by-0-or-1","errorCode":null,"errorMessage":"invalid escape: ~ must be followed by 0 or 1","messagePattern":"invalid escape: ~ must be followed by 0 or 1","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/binding/json_pointer.go","lineNumber":67,"sourceCode":"\t\tif !exists {\n\t\t\treturn nil, fmt.Errorf(\"json pointer %q: key %q not found\", pointer, key)\n\t\t}\n\n\t\tcurrent = val\n\t}\n\n\treturn current, nil\n}\n\nfunc decodeJSONPointerSegment(raw string) (string, error) {\n\tvar out strings.Builder\n\tfor i := 0; i < len(raw); i++ {\n\t\tif raw[i] != '~' {\n\t\t\tout.WriteByte(raw[i])\n\t\t\tcontinue\n\t\t}\n\t\tif i+1 >= len(raw) {\n\t\t\treturn \"\", fmt.Errorf(\"invalid escape: ~ must be followed by 0 or 1\")\n\t\t}\n\t\tswitch raw[i+1] {\n\t\tcase '0':\n\t\t\tout.WriteByte('~')\n\t\tcase '1':\n\t\t\tout.WriteByte('/')\n\t\tdefault:\n\t\t\treturn \"\", fmt.Errorf(\"invalid escape: ~%c must be ~0 or ~1\", raw[i+1])\n\t\t}\n\t\ti++\n\t}\n\treturn out.String(), nil\n}\n","sourceCodeStart":49,"sourceCodeEnd":81,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/internal/binding/json_pointer.go#L49-L81","documentation":"decodeJSONPointerSegment enforces RFC 6901 escape sequences: a '~' inside a pointer segment must be followed by '0' (literal '~') or '1' (literal '/'). A segment ending with a bare '~' has no following character, so the segment is rejected.","triggerScenarios":"Pointer segment ends with '~', e.g. \"/mykey~\" or \"/a/b~\" during ReadJSONPointer traversal.","commonSituations":"Keys whose literal names end with '~' that weren't escaped to '~0'; truncated pointers; tilde used as a shell home-dir abbreviation and passed through unescaped.","solutions":["Escape the literal tilde as '~0' (e.g. \"/mykey~0\" for key \"mykey~\")","Remove the trailing '~' if it was accidental","Expand '~' home-dir references to a full path before building the pointer"],"exampleFix":"// before\nReadJSONPointer(data, \"/secret~\")\n// after\nReadJSONPointer(data, \"/secret~0\")","handlingStrategy":"validation","validationCode":"func sanitizeSegment(s string) string {\n    return strings.ReplaceAll(strings.ReplaceAll(s, \"~\", \"~0\"), \"/\", \"~1\")\n}","typeGuard":null,"tryCatchPattern":"val, err := binding.ReadJSONPointer(data, ptr)\nif err != nil && strings.Contains(err.Error(), \"invalid escape\") {\n    // rebuild pointer with escapeSegment applied per key\n}","preventionTips":["Escape keys with a shared helper before joining segments into a pointer","Never pass raw user/OS strings (like '~') into a pointer unescaped"],"tags":["json","rfc6901","escaping"],"backgroundTag":"invalid-json-pointer","analyzedSha":"7fd6ef3c07182257ce776cdc5a614e122d5bd4b3","analyzedAt":"2026-09-04T21:17:44.649Z","contentChangedAt":"2026-09-04T21:17:44.649Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}