为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用 org.json 库解析 json 数组?

无法使用 org.json 库解析 json 数组?

胡说叔叔 2021-08-19 16:14:01
我有一个下面的 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)我在这里做什么错了?
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

在 voyager 周围放置 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 中双重转义以保留它们。


查看完整回答
反对 回复 2021-08-19
?
烙印99

TA贡献1829条经验 获得超13个赞

《航海者》

这需要双重转义。解析器将\"视为引用的结尾并期望,}

尝试

\\\"voyager\\\"


查看完整回答
反对 回复 2021-08-19
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

在 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();

}


查看完整回答
反对 回复 2021-08-19
  • 3 回答
  • 0 关注
  • 416 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信