{"record":{"id":"ffcc0f4f04a36056","repo":"Tencent/APIJSON","slug":"value-value-put-boolean-number-str","errorCode":null,"errorMessage":"{}:value 中value不合法！非PUT请求只支持 [Boolean, Number, String] 内的类型 ！","messagePattern":"(.+?):value 中value不合法！非PUT请求只支持 \\[Boolean, Number, String\\] 内的类型 ！","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":400,"severity":"error","filePath":"APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java","lineNumber":4033,"sourceCode":"\t\tcase 6:\n\t\t\treturn gainContainString(key, column, value, rawSQL);\n\t\tcase 7:\n\t\t\treturn gainCompareString(key, column, value, \">=\", rawSQL);\n\t\tcase 8:\n\t\t\treturn gainCompareString(key, column, value, \"<=\", rawSQL);\n\t\tcase 9:\n\t\t\treturn gainCompareString(key, column, value, \">\", rawSQL);\n\t\tcase 10:\n\t\t\treturn gainCompareString(key, column, value, \"<\", rawSQL);\n\t\tdefault:  // TODO MySQL JSON类型的字段对比 key='[]' 会无结果！ key LIKE '[1, 2, 3]'  //TODO MySQL , 后面有空格！\n\t\t\treturn gainEqualString(key, column, value, rawSQL);\n\t\t}\n\t}\n\n\n\tpublic String gainEqualString(String key, String column, Object value, String rawSQL) throws Exception {\n\t\tif (value != null && JSON.isBoolOrNumOrStr(value) == false && value instanceof Subquery == false) {\n\t\t\tthrow new IllegalArgumentException(key + \":value 中value不合法！非PUT请求只支持 [Boolean, Number, String] 内的类型 ！\");\n\t\t}\n\n\t\tboolean not = column.endsWith(\"!\"); // & | 没有任何意义，写法多了不好控制\n\t\tif (not) {\n\t\t\tcolumn = column.substring(0, column.length() - 1);\n\t\t}\n\n\t\tString rc = column.endsWith(\"[\") || column.endsWith(\"{\") ? column.substring(0, column.length() - 1) : column;\n\t\tif (StringUtil.isName(rc) == false) {\n\t\t\tthrow new IllegalArgumentException(key + \":value 中key不合法！不支持 ! 以外的逻辑符 ！\");\n\t\t}\n\n\t\tString logic = value == null && rawSQL == null ? (not ? SQL.IS_NOT : SQL.IS) : (not ? \" != \" : \" = \");\n\t\treturn gainKey(column) + logic + (value instanceof Subquery ? gainSubqueryString((Subquery<T, M, L>) value)\n\t\t\t\t: (rawSQL != null ? rawSQL : gainValue(key, column, value)));\n\t}\n\n\tpublic String gainCompareString(String key, String column, Object value, String type, String rawSQL) throws Exception {","sourceCodeStart":4015,"sourceCodeEnd":4051,"githubUrl":"https://github.com/Tencent/APIJSON/blob/5284052872898eddc449a58f629e5c8d588b8e22/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L4015-L4051","documentation":"Thrown by gainEqualString when the value used in an '='/'IS' condition is not a Boolean, Number, or String and is not a Subquery. Non-PUT requests only allow scalar types for equality, so JSONObject/JSONArray/Map values are rejected before SQL generation.","triggerScenarios":"Sending {\"User\": {\"tag\": [1,2,3]}} (use \"tag{}\" for matching arrays) or {\"info\": {\"a\":1}} with a GET/DELETE method, where value arrives as a collection/map.","commonSituations":"Confusing '=' with the IN/match operator: developers send arrays to key instead of key{}; sending JSON objects where the column expects a scalar.","solutions":["For matching against multiple values use the {} operator: \"tag{}\": [1,2,3].","For a single value, send a plain Boolean/Number/String.","For JSON-typed columns, use the appropriate key suffix (key$ / key{}) or raw SQL rather than a nested object value."],"exampleFix":"// before\n{\"User\": {\"id\": [1, 2]}}\n// after\n{\"User\": {\"id{}\": [1, 2]}}","handlingStrategy":"type-guard","validationCode":"const isScalar = v => v === null || ['boolean','number','string'].includes(typeof v);\nfor (const [k, v] of Object.entries(tableObj)) {\n  if (k.startsWith('@') || /[{}$~<>%]|!$|\\[$|\\{$/.test(k)) continue;\n  if (!isScalar(v)) throw new Error(`key ${k} needs a scalar or key{} for arrays`);\n}","typeGuard":"function isBoolOrNumOrStr(v) { return typeof v === 'boolean' || typeof v === 'number' || typeof v === 'string'; }","tryCatchPattern":null,"preventionTips":["Use key{} for arrays/maps, plain key only for scalars.","Run a request-linter that flags non-scalar values on non-PUT equality keys."],"tags":["apijson","value-type","equal","validation"],"backgroundTag":null,"analyzedSha":"5284052872898eddc449a58f629e5c8d588b8e22","analyzedAt":"2026-08-14T15:15:29.577Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}