遇到一个最近的问题,用户提交的字符串值“null”作为“null”存储到数据库中。基本上在字符串的开头和结尾添加了双引号。
调查显示 JSON-lib 似乎没有正确处理“空”字符串值。这通过以下测试方法表现出来。
@Test
public void shouldHandleNullStringInJsonFormattedString() {
String jsonTest = "[\"null\",\"aValue\"]";
assertTrue(jsonTest.contains("\"null\""));
assertFalse(jsonTest.contains("\"\\\"null\\\"\""));
String convertedBack = JSONSerializer.toJSON(jsonTest).toString();
// fails at below line
assertFalse(convertedBack.contains("\"\\\"null\\\"\""));
}
@Test
public void shouldHandleNullStringLiteral() {
JSONArray jsonArray1 = JSONArray.fromObject(Arrays.asList(null,"b"));
JSONArray jsonArray2 = JSONArray.fromObject(Arrays.asList(JSONNull.getInstance(),"b"));
JSONArray jsonArray3 = JSONArray.fromObject(Arrays.asList("null","b"));
assertEquals("[null,\"b\"]", jsonArray1.toString());
assertEquals("[null,\"b\"]", jsonArray2.toString());
//fails at below line
assertEquals("[\"null\",\"b\"]", jsonArray3.toString());
}
基本上当浏览器将 ["null", "aValue"] 发送到服务器时,JSON-lib 会将其更改为 ["\"null\"", "aValue"]。同样从服务器端,我们无法使用 JSONArray 构造 JSON 格式的字符串,例如 ["null", "b"]。JSON-lib 似乎无法正确处理这两种基本情况。
已通过电子邮件发送到邮件列表并在其网站上发送了联系电子邮件,但尚未回复。好像之前有人在上面发过这个问题
http://sourceforge.net/p/json-lib/discussion/587134/thread/faf83e9a/
但也没有任何回应。
任何机构对此问题有任何建议/修复?
我们正在使用最新版本的 json-lib 即 2.4
更新
看json lib net.sf.json.util.JSONUtils.mayBeJSON方法的源码有点奇怪。
public static boolean mayBeJSON( String string ) {
return string != null
&& ("null".equals( string )
|| (string.startsWith( "[" ) && string.endsWith( "]" )) || (string.startsWith( "{" ) && string.endsWith( "}" )));
}
似乎任何“null”的字面字符串值都被视为 JSON ?