我有一个下面的JSON数组,我正在尝试解析它,但它给了我一个例外:
[{
"response": {
"client": "123456",
"111": {
"data": "0\u00181535480381\u00191535480347\u0018\"voyager\";-1;12;0\u00181535480075\u00191535480069",
"time": "981542121421"
}
}
}]
我正在使用org.json.JSONArray
来解析上面的JSON,但是下面的代码会引发异常:
String json =
"[{ \"response\": { \"client\": \"123456\", \"111\": { \"data\": \"0\u00181535480381\u00191535480347\u0018\"voyager\";-1;12;0\u00181535480075\u00191535480069\", \"time\": \"981542121421\" } } }]";
// this line throws exception
JSONArray jsonArray = new JSONArray(json);
这是我看到的异常:
Exception in thread "main" org.json.JSONException: Expected a ',' or '}' at character 81
at org.json.JSONTokener.syntaxError(JSONTokener.java:410)
at org.json.JSONObject.<init>(JSONObject.java:222)
at org.json.JSONTokener.nextValue(JSONTokener.java:344)
at org.json.JSONObject.<init>(JSONObject.java:205)
at org.json.JSONTokener.nextValue(JSONTokener.java:344)
at org.json.JSONObject.<init>(JSONObject.java:205)
at org.json.JSONTokener.nextValue(JSONTokener.java:344)
at org.json.JSONArray.<init>(JSONArray.java:125)
at org.json.JSONArray.<init>(JSONArray.java:157)
我在这里做什么错了?
答案 0 :(得分:3)
将esacpe角色放置在航海家附近,如下所示。
\\\"voyager\\\"
我测试了它的工作原理。
import org.json.JSONArray;
public class Test {
public static void main(String[] args) {
String json = "[{ \"response\": { \"client\": \"123456\", \"111\": { \"data\": \"0\u00181535480381\u00191535480347\u0018\\\"voyager\\\";-1;12;0\u00181535480075\u00191535480069\", \"time\": \"981542121421\" } } }]";
// this line throws exception
JSONArray jsonArray = new JSONArray(json);
}
}
由于它已经在JOSN中转义了字符,因此需要在Java中进行两次转义以保留它们。
答案 1 :(得分:2)
\“旅行者\”
这需要两次转义。解析器将\"
视为引号的结尾,并期望,
或}
尝试
\\\"voyager\\\"
答案 2 :(得分:1)
在JSON语法中,您错在一个地方-“ 111”,因为名称必须是字符串。因此,@ NarayanP的代码无法在android系统上运行。
您的代码引发异常,这不是json的错误。问题在分配行中;
String json = "...";
如果您通过http响应或文件读取将 json 中的值放在下面
"data": "0\u00181535480381\u00191535480347\u0018\"voyager\";-1;12;0\u00181535480075\u00191535480069"
那么json的值实际上就是
data: 015354803811535480347"voyager";-1;12;015354800751535480069 [escaped \u0018 etc. by stackoverflow]
如果JSON字符串包含分号,则仅返回直到遇到的第一个分号为止的字符串部分。 因此,在解析上方的json字符串时,数据项将与
相同015354803811535480347"voyager"
然后“ -1”,“ 12”是JSON语法错误。
以下是完整代码,没有错误。
String json = "[{\n" +
" \"response\": {\n" +
" \"client\": \"123456\",\n" +
" \"varname111\": {\n" +
" \"data\": \"0\\u00181535480381\\u00191535480347\\u0018\\\"voyager\\\";-1;12;0\\u00181535480075\\u00191535480069\",\n" +
" \"time\": \"981542121421\"\n" +
" }\n" +
" }\n" +
"}]";
JSONArray jsonArray = null;
try {
jsonArray= new JSONArray(json);
} catch (Exception e) {
e.printStackTrace();
}