org.json - 尝试解析包含 html 字符串的 JSONArray 时出现 StackOverflowError

org.json - StackOverflowError when attempting to parse JSONArray containing html strings

我有最新版本的 org.json - json-20171018.

在我的应用程序中,我必须在Java 的各个字段中创建一个JSON数组,这些字段是在TinyMCE 的帮助下在前端(javascript) 创建的。我必须转义文本中的引号,否则它不会被正确地字符串化。将此参数以及其他参数传递到后端后,我尝试解析 JSON.

在前端:

var array = [];
for (var i = 0; i < thing.length; i++) {
    var txt = tinyMCE.get("element").getContent();
    txt = txt.replace(/"/g, '\"');
    //-The text is then encoded for passing to the back end

    object["id"] = id;
    object["text"] = txt;
    object["display_order"] = i;
    //-etc, etc.
    array.push(object);
}
var sArray = { "array" : array };
sArray = JSON.stringify(sArray);

params = "arr="+sArray;

然后将其传递到后端。我的日志服务器在一个字符串中显示如下:

"{\"array\":[{\"id\":\"1\",\"text\":\"<p><span style=\\"font-size: 11pt; font-family: 'Comic Sans MS', cursive;\\">gfsgsfgsfd</span></p>\",\"correct_answer\":false,\"display_order\":0,\"font\":\"Comic Sans MS\",\"font_size\":\"11pt\"}]}";
//-Or, escaped up a level:
{"array":[{"id":"1","text":"<p><span style=\"font-size: 11pt; font-family: 'Comic Sans MS', cursive;\">gfsgsfgsfd</span></p>","correct_answer":false,"display_order":0,"font":"Comic Sans MS","font_size":"11pt"}]}

我获取字符串并创建一个 JSON对象,它似乎工作正常。

String sArr = req.getParameter("arr").trim();
JSONObject jsonObject = new JSONObject(sArr);
if (jsonObject.has("array")) { .... }

记录每一步后,我确定 JSON对象确实有这个数组:

[{"font_size":"11pt","correct_answer":false,"display_order":0,"id":"1","text":"<p><span style=\"font-size: 11pt; font-family: 'Comic Sans MS', cursive;\">gasdgwere<\/span><\/p>","font":"Comic Sans MS"}]

而且它的类型正确 org.json。JSON数组。

只有当我尝试将 JSON 数组作为 JSON 数组(而不是对象或 Object.toString())时,一切都会崩溃。

JSONArray jsonArray = jsonObject.getJSONArray("array");
//-OR:
JSONArray jsonArray = (JSONArray)jsonObject.get("array");
//-I have tried both, with the same result

此时我最终收到 WhosebugError。

SEVERE [http-nio-8443-exec-16] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [dispatcher] in context with path [/path] threw exception [Handler processing failed; nested exception is java.lang.WhosebugError] with root cause
java.lang.WhosebugError
    at java.util.HashMap$EntryIterator.<init>(Unknown Source)
    at java.util.HashMap$EntrySet.iterator(Unknown Source)
    at org.json.JSONObject.write(JSONObject.java:2329)
    at org.json.JSONObject.writeValue(JSONObject.java:2272)
    at org.json.JSONObject.write(JSONObject.java:2337)
    at org.json.JSONObject.writeValue(JSONObject.java:2272)
    at org.json.JSONObject.write(JSONObject.java:2337)
    at org.json.JSONObject.writeValue(JSONObject.java:2272)
    at org.json.JSONObject.write(JSONObject.java:2337)
    at org.json.JSONObject.writeValue(JSONObject.java:2272)
    //-And on and on....

我在应用程序的其他部分使用类似方法时没有遇到任何类型的错误。由于来自 tinyMCE 的 HTML 字符串,我唯一能想到的是这个特定实例包含嵌套引号。此外,正如您在抓取数组时看到的那样,由于某种原因,结束标记 HTML 中的斜杠被转义了(即 < \ / span> 而不是 )。我不确定这是否有任何相关性。

嗯,原来这完全是我的错。我认为我发布的特定行是导致此错误的原因,因为我在尝试正确转义 JSON 时遇到了相当困难的事实。

但事实证明,因为我的 Tomcat 日志没有指定我的 class 的确切行,我错误地认为是那个特定的 JSON 对象导致了错误。不,结果在我的方法中有点进一步,我有这个小 gem:

JSONObject jResponse = new JSONObject();
jResponse.put("response", jResponse);

是的。这是一个非常简单的错误,我做出了错误的假设。我不确定我是怎么错过的。谢谢大家的意见,我现在就躲到羞耻的角落里去吧。