java.lang.ClassCastException:JSON keys must be stringsをsetAllowNonStringKeysで解決

2542 ワード

ずっとjson-lib-2.4-jdk 15を使って、感じは悪くなくて、jsonConfigを通じて柔軟な設定のパラメータ
(ツッコミで、このjarは久しぶりに更新しました)
 
今日使った時、異常を報告しました. java.lang.ClassCastException: JSON keys must be strings
 
コードクリップは次のとおりです. 
 
			LinkedHashMap<Integer, String> iteratorIndexMap = new LinkedHashMap<Integer, String>();
			for (int i = startIteratorIndex; i <= endIteratorIndex; ++i){
				iteratorIndexMap.put(i, map.get(i));
			}
			pagerVMParam.setIteratorIndexMap(iteratorIndexMap);

			Map<String, Object> vmParamMap = new HashMap<String, Object>();
			vmParamMap.put("pagerVMParam", pagerVMParam);
			if (log.isDebugEnabled()){
				log.debug("vmParamMap:{}", JsonUtil.format(vmParamMap));
				log.debug("debugIsNotParseVM:{}", debugIsNotParseVM);
			}

 
 
LinkedHashMapを使っているので、keyはintegerタイプです
 
 
ネット上で解決策を与えた人がいます.
http://hi.baidu.com/wsndbhs/item/1267fca7be8e989a151073b6
 
彼の提案は次のとおりです.
        MapのキーをStringに変更します.
 
        あるいはjarパッケージを交換して、低バージョンに交換します!
 
 
最善の解決策ではないと思います.このソースコードを見てみましょう.
            if( !(k instanceof String) && !jsonConfig.isAllowNonStringKeys() ) {
               throw new ClassCastException("JSON keys must be strings.");
            }

 
設定 setAllowNonStringKeys問題を解決するために、以下は私がカプセル化した汎用コードで、出力オブジェクトをjsonフォーマットにフォーマットして、私たちのdebugコードやログを記録するのに便利です.
 
	/**
	 * Format.
	 * 
	 * @param obj
	 *            the obj
	 * @param excludes
	 *            the excludes         json   
	 * @return the string
	 */
	public static String format(Object obj,String[] excludes){
		JsonConfig jsonConfig = new JsonConfig();

		//   ,       There is a cycle in the hierarchy!
		jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
		jsonConfig.setIgnoreDefaultExcludes(true);
		jsonConfig.setAllowNonStringKeys(true);

		if (Validator.isNotNullOrEmpty(excludes)){
			jsonConfig.setExcludes(excludes);
		}
		String string = JsonUtil.toJSON(obj, jsonConfig).toString(4, 4);
		return string;
	}