ユーザーが送信した文字列値 'null' が '"null"' としてデータベースに格納されているという最近の問題に遭遇しました。基本的に、文字列の最初と最後に二重引用符が追加されています。
調査の結果、JSON-lib が「null」文字列値を正しく処理していないように見えることが明らかになりました。これは、以下の試験方法により示される。
@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 を使用して ["null", "b"] のような JSON 形式の文字列を構築することはできません。JSON-lib は、これら 2 つの基本的なシナリオを適切に処理していないようです。
メーリング リストに電子メールを送信し、サイトに記載されている連絡先の電子メールを送信しましたが、まだ応答がありません。誰かが以前にこの問題について投稿したようです
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 と見なされるようです??