【问题标题】:org.json - StackOverflowError when attempting to parse JSONArray containing html stringsorg.json - 尝试解析包含 html 字符串的 JSONArray 时出现 StackOverflowError
【发布时间】:2018-05-10 23:48:04
【问题描述】:

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

在我的应用程序中,我必须在 Java 中创建一个各种字段的 JSONArray,这些字段是在 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"}]}

我获取字符串并创建一个 JSONObject,这似乎工作正常。

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

在记录了每一步之后,我确定 JSONObject 确实有这个数组:

[{"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.JSONArray 类型的,正确的。

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

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

此时我最终得到了 StackOverflowError。

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.StackOverflowError] with root cause
java.lang.StackOverflowError
    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 标记中的斜线被转义(即, 而不是 )。我不确定这是否有任何相关性。

【问题讨论】:

  • 将其设为String,然后执行new JSONArray(string) 会改变什么吗?
  • 我已经执行了你的代码,一切正常。
  • 您正在执行 write 方法。 at org.json.JSONObject.write(JSONObject.java:2329)
  • @M.Prokhorov - 我刚刚尝试过,不幸的是我仍然遇到同样的问题。
  • @EleazarEnrique - 如果除了 write 方法之外还有其他方法可以从 JSONObject 检索 JSONArray,我不知道。这就是在整个应用程序的其余部分中从 JSONObjects 中获取 JSONArrays 的方式。

标签: javascript java json stack-overflow org.json


【解决方案1】:

好吧,事实证明这完全是我的错。我认为我发布的特定行是导致此错误的原因,因为我很难正确地转义 JSON。

但事实证明,因为我的 Tomcat 日志没有指定我的类的确切行,我错误地认为是那个特定的 JSONObject 导致了错误。不,结果证明我的方法更进一步,我有这个小宝石:

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

是的。这是一个非常简单的错误,我做出了错误的假设。我不知道我是怎么错过的。谢谢大家的意见,我现在要躲在我的耻辱的角落里。

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2012-06-20
    相关资源
    最近更新 更多