0

遇到一个最近的问题,用户提交的字符串值“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 ?

4

1 回答 1

0

任何机构对此问题有任何建议/修复?

我的建议是从 github 下载并构建最新版本(项目“aalmiray / Json-lib”)。先试试“master”分支,再试试“development”分支,最后看看存在的各种fork。

如果这没有给您答案,请创建自己的分叉并为自己开发修复程序……然后发送拉取请求以将其合并。


计划 B 是寻找 json-lib 的替代方案,以便更快地解决问题。这个项目的所有者似乎要花很长时间来处理问题并根据合并请求采取行动。

于 2013-10-17T11:05:24.137 回答