{"record":{"id":"e409d06ffb378d89","repo":"binarywang/WxJava","slug":"error-e409d0","errorCode":null,"errorMessage":"参数个数必须为偶数","messagePattern":"参数个数必须为偶数","errorType":"validation","errorClass":"WxRuntimeException","httpStatus":null,"severity":"error","filePath":"weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java","lineNumber":176,"sourceCode":"   *\n   * @param keyOrValue 包含key或value的数组\n   * @return JsonObject对象.\n   */\n  public static JsonObject buildJsonObject(Object... keyOrValue) {\n    JsonObject result = new JsonObject();\n    put(result, keyOrValue);\n    return result;\n  }\n\n  /**\n   * 批量向JsonObject对象中添加属性\n   *\n   * @param jsonObject 原始JsonObject对象\n   * @param keyOrValue 包含key或value的数组\n   */\n  public static void put(JsonObject jsonObject, Object... keyOrValue) {\n    if (keyOrValue.length % 2 == 1) {\n      throw new WxRuntimeException(\"参数个数必须为偶数\");\n    }\n\n    for (int i = 0; i < keyOrValue.length / 2; i++) {\n      final Object key = keyOrValue[2 * i];\n      final Object value = keyOrValue[2 * i + 1];\n      if (value == null) {\n        jsonObject.add(key.toString(), null);\n        continue;\n      }\n\n      if (value instanceof Boolean) {\n        jsonObject.addProperty(key.toString(), (Boolean) value);\n      } else if (value instanceof Character) {\n        jsonObject.addProperty(key.toString(), (Character) value);\n      } else if (value instanceof Number) {\n        jsonObject.addProperty(key.toString(), (Number) value);\n      } else if (value instanceof JsonElement) {\n        jsonObject.add(key.toString(), (JsonElement) value);","sourceCodeStart":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/binarywang/WxJava/blob/1c43293a3c2c9d7e91304b6d037fb017f680d0c6/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java#L158-L194","documentation":"Thrown by GsonHelper.put()/buildJsonObject() when the varargs keyOrValue array has an odd length. These helpers expect an alternating key,value,key,value... sequence; an odd count means a value is missing, so the method refuses to silently produce malformed JSON. It is a programmer/contract error, not data-driven.","triggerScenarios":"Calling buildJsonObject(\"k1\", v1, \"k2\") or put(obj, \"k1\", v1, \"k2\") with a dangling key, or passing a List/array flattened incorrectly so the element count is odd.","commonSituations":"Refactor that drops a value; copy-paste that adds a key without its value; dynamically building the varargs from a collection whose size assumption is wrong.","solutions":["Recount the arguments to buildJsonObject/put and ensure they come in key/value pairs.","If constructing the array dynamically, assert args.length % 2 == 0 before calling.","Prefer the typed JsonObject.addProperty overloads for single fields to avoid varargs mistakes."],"exampleFix":"// before\nJsonObject o = GsonHelper.buildJsonObject(\"k1\", v1, \"k2\");\n// after\nJsonObject o = GsonHelper.buildJsonObject(\"k1\", v1, \"k2\", v2);","handlingStrategy":"validation","validationCode":"Object[] kv = {\"k1\", v1, \"k2\", v2};\nif (kv.length % 2 != 0) {\n  throw new IllegalStateException(\"key/value pairs must be even\");\n}\nJsonObject o = GsonHelper.buildJsonObject(kv);","typeGuard":"static boolean isEvenKv(Object... kv) { return kv != null && kv.length % 2 == 0; }","tryCatchPattern":"null","preventionTips":["Always pass key/value pairs; count arguments explicitly.","Prefer JsonObject.addProperty for single fields.","When building varargs dynamically, assert even length first."],"tags":["gson","json","validation","programmer-error"],"backgroundTag":null,"analyzedSha":"1c43293a3c2c9d7e91304b6d037fb017f680d0c6","analyzedAt":"2026-08-14T02:29:11.060Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}