【问题标题】:Json Response to string ArrayJson 对字符串数组的响应
【发布时间】:2017-11-21 13:11:10
【问题描述】:

我想将我的 json 字符串转换为字符串数组。我的 JSON 字符串有两个参数“href”和“name”。我想使用 java 创建“名称”参数值的字符串列表。我正在为我的应用程序使用 NetBeans。请帮我解决这个问题。我收到错误

线程“AWT-EventQueue-0”org.json.JSONException 中的异常:JSONArray 文本必须以 '[' 在 1 [字符 2 第 1 行] 开始

JSONArray arr = new JSONArray(response);
List<String> list = new ArrayList<String>();
for(int i = 0; i < arr.length(); i++){
    list.add(arr.getJSONObject(i).getString("name"));
    System.out.println(arr.getJSONObject(i).getString("name"));
}

这是我的 JSON 字符串

[
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/1",
        "name": "analogValue_1"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/9",
        "name": "analogValue_9"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/2",
        "name": "analogValue_2"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/8",
        "name": "analogValue_8"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/7",
        "name": "analogValue_7"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/3",
        "name": "analogValue_3"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/6",
        "name": "analogValue_6"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/5",
        "name": "analogValue_5"
    },
    {
        "href": "\/api\/rest\/v1\/protocols\/bacnet\/local\/objects\/analog-value\/4",
        "name": "analogValue_4"
    }
]

【问题讨论】:

  • 响应包含什么?正如错误消息告诉我们它不是以“[”
  • 由于某种原因,您的字符串不是有效的 JSON 字符串,因此您显示的 json 不是输入 json
  • 我发布的Json string是我从rest api查询中得到的响应
  • 我检查了你的例子,我的运行正常。所以问题是你的反应有点不同于这个
  • System.out.println(response.body().toString());得到 okhttp3.internal.http.RealResponseBody@66cdc1bd 不是实际响应为什么会这样?

标签: java json


【解决方案1】:

修复你的 json。 1.将方括号改为大括号。 2. json 中的每个字典都是一个值,必须有一个对应的键。您的代码应如下所示:

public static void main(String[] args) {

        String myJSON = "{data_0:\n"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/1\",\n"
                + "        \"name\": \"analogValue_1\"\n"
                + "    },\n data_1:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/9\",\n"
                + "        \"name\": \"analogValue_9\"\n"
                + "    },\n data_2:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/2\",\n"
                + "        \"name\": \"analogValue_2\"\n"
                + "    },\n data_3:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/8\",\n"
                + "        \"name\": \"analogValue_8\"\n"
                + "    },\n data_4:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/7\",\n"
                + "        \"name\": \"analogValue_7\"\n"
                + "    },\n data_5:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/3\",\n"
                + "        \"name\": \"analogValue_3\"\n"
                + "    },\n data_6:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/6\",\n"
                + "        \"name\": \"analogValue_6\"\n"
                + "    },\n data_7:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/5\",\n"
                + "        \"name\": \"analogValue_5\"\n"
                + "    },\n data_8:"
                + "    {\n"
                + "        \"href\": \"\\/api\\/rest\\/v1\\/protocols\\/bacnet\\/local\\/objects\\/analog-value\\/4\",\n"
                + "        \"name\": \"analogValue_4\"\n"
                + "    }\n"
                + "}";

        JSONObject jsonObject = new JSONObject(myJSON);
        System.out.println("jsonObject: " + jsonObject.toString());

        List<String> list = new ArrayList<String>();
        System.out.println("jsonObject length: " + jsonObject.length());
        for (int i = 0; i < jsonObject.length(); i++) {
            list.add(jsonObject.getJSONObject("data_" + i).toString());
            System.out.println(jsonObject.getJSONObject("data_" + i));
        }
    }

我添加了从 data_0 到 data_8 的键。然后你创建一个列表。可能这并不能完全解决您的问题,但至少可以说明您在哪里犯了错误。

【讨论】:

    【解决方案2】:

    从您的评论中我们可以看出您正在使用okhttp3.internal.http.RealResponseBody。由于toString() 方法未被覆盖,因此使用默认实现,这就是System.out.println(response.body().toString()); 打印okhttp3.internal.http.RealResponseBody@66cdc1bd 的原因。

    要获得实际的原始响应,请使用string() 方法:

    JSONArray arr = new JSONArray(responseBody.string());
    

    根据documentation(RealResponseBody 扩展ResponseBody):

    String  string()
    Returns the response as a string decoded with the charset of the Content-Type header.
    

    顺便说一句,这也已经讨论过here

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多