简体   繁体   English

Json对字符串数组的响应

[英]Json Response to string Array

I want to convert my json string to string array. 我想将json字符串转换为字符串数组。 My JSON string is having two parameters "href" and "name". 我的JSON字符串具有两个参数“ href”和“ name”。 I want to create List of string of values of "name" parameter using java. 我想使用Java创建“名称”参数值字符串列表。 I am using NetBeans for my application. 我正在为我的应用程序使用NetBeans。 please help me out to resolve this issue. 请帮助我解决此问题。 I am getting error as 我收到错误消息

Exception in thread "AWT-EventQueue-0" org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1] 线程“ 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"));
}

This is my JSON string 这是我的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"
    }
]

Fix your json. 修复您的json。 1. Change square brackets to curly brackets. 1.将方括号更改为大括号。 2. Each dictionary inside of your json is a value which must have a corresponding key. 2. json内的每个字典都是一个值,必须具有一个对应的键。 You code should look like this: 您的代码应如下所示:

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));
        }
    }

I added keys from data_0 to data_8. 我将密钥从data_0添加到了data_8。 Then you create a list. 然后,您创建一个列表。 Probably that does not exactly solve your problem, but least gives an idea where you're making a mistake. 可能不能完全解决您的问题,但至少可以给出您犯错的想法。

From your comment we can see that you're using okhttp3.internal.http.RealResponseBody . 从您的评论中我们可以看到您正在使用okhttp3.internal.http.RealResponseBody Since the toString() method is not overwritten, the default implementation is used which is why System.out.println(response.body().toString()); 由于toString()方法不会被覆盖,因此使用默认实现,这就是为什么System.out.println(response.body().toString()); prints okhttp3.internal.http.RealResponseBody@66cdc1bd . 打印okhttp3.internal.http.RealResponseBody@66cdc1bd

To get the actual raw response use the string() method: 要获取实际的原始响应,请使用string()方法:

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

According to the documentation (RealResponseBody extends ResponseBody): 根据文档 (RealResponseBody扩展了ResponseBody):

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

This also has already been discussed here by the way. 顺便说一下 ,这已经在这里讨论了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM