【发布时间】: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