如何将字符串转换为JSONArray

时间:2016-11-01 10:50:15

标签: java json api jsonobject

我正在点击api并获得字符串响应。响应是这样的

"["VU","Vanuatu",["Pacific/Efate","(GMT+11:00) Efate"],"VN","Vietnam",["Asia/Saigon","(GMT+07:00) Hanoi"]]"

我想将此字符串转换为类型

的json数组

[{"id":"VN","name":"Vanuatu","timezones":[{"id":Pacific/Efate,"name":"(GMT+11:00) Efate}]},"id":"VN","name":"Vietnam",[{"id":"Asia/Saigon","name":"(GMT+07:00) Hanoi"}]]

有人可以提供帮助

2 个答案:

答案 0 :(得分:1)

查看您的String回复,我创建了一个正则表达式,可以在您的回复中创建四个组。

DEMO

假设您的输出总是以四个为一组(即id,name和timezones_id,timezones_name),这个正则表达式将从您提供的输入字符串中提取4个组:

<强>正则表达式:

"([^"]*)",\s*"([^"]*)",\s*\["([^"]*)",\s*"([^"]*)"\]

<强>匹配

Match 1
    Full match  1-56    `"VU", "Vanuatu", ["Pacific/Efate", "(GMT+11:00) Efate"]`
        Group 1.    2-4     `VU`
        Group 2.    8-15    `Vanuatu`
        Group 3.    20-33   `Pacific/Efate`
        Group 4.    37-54   `(GMT+11:00) Efate`
Match 2
    Full match  58-111  `"VN", "Vietnam", ["Asia/Saigon", "(GMT+07:00) Hanoi"]`
        Group 1.    59-61   `VN`
        Group 2.    65-72   `Vietnam`
        Group 3.    77-88   `Asia/Saigon`
        Group 4.    92-109  `(GMT+07:00) Hanoi`

现在,一旦您提取了这4个组,您只需在ArrayListList中添加适当的内容,然后在这些列表中创建JSONArray

以下程序对输入和输出不言自明。

<强>输入

["VU","Vanuatu",["Pacific/Efate","(GMT+11:00) Efate"],"VN","Vietnam",["Asia/Saigon","(GMT+07:00) Hanoi"]]

<强>输出

[{"timezones":{"name":"(GMT+11:00) Efate","id":"Pacific/Efate"},"name":"Vanuatu","id":"VU"},{"timezones":{"name":"(GMT+07:00) Hanoi","id":"Asia/Saigon"},"name":"Vietnam","id":"VN"}]

格式化输出

[{

        "id" : "VU",
        "name" : "Vanuatu",
        "timezones" : {
            "name" : "(GMT+11:00) Efate",
            "id" : "Pacific/Efate"
        }
    }, {
        "id" : "VN",
        "name" : "Vietnam",
        "timezones" : {
            "name" : "(GMT+07:00) Hanoi",
            "id" : "Asia/Saigon"
        }
    }
]

<强>代码

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONException;


public class Test
{
    public static void main(String[] args) throws IOException, JSONException {
        String serverResponse = "[\"VU\", \"Vanuatu\", [\"Pacific/Efate\", \"(GMT+11:00) Efate\"], \"VN\", \"Vietnam\", [\"Asia/Saigon\", \"(GMT+07:00) Hanoi\"]]";
        Map<String, Object> prop, innerProp;
        List<Object> arr = new ArrayList<>(), obj;

        String pattern = "\"([^\"]*)\",\\s*\"([^\"]*)\",\\s*\\[\"([^\"]*)\",\\s*\"([^\"]*)\"\\]";

        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(serverResponse);

        while (m.find()) {
            prop = new HashMap<>();
            prop.put("id", m.group(1));
            prop.put("name", m.group(2));

            innerProp = new HashMap<>();
            innerProp.put("id", m.group(3));
            innerProp.put("name", m.group(4));

            prop.put("timezones", innerProp);
            arr.add(prop);
        }


        JSONArray jsonArray = new JSONArray(arr);
        System.out.println(jsonArray.toString());
    }
}

答案 1 :(得分:0)

您有一个选项是先从字符串中创建一个JSONArray,然后从该数组中读取3到3的元素以创建输出:

public static void main(String[] args) {
    String input = "[\"VU\",\"Vanuatu\",[\"Pacific/Efate\",\"(GMT+11:00) Efate\"],\"VN\",\"Vietnam\",[\"Asia/Saigon\",\"(GMT+07:00) Hanoi\"]]";
    JSONArray inputArray = new JSONArray(input);
    JSONArray outputArray = new JSONArray();
    for (int i = 0; i < inputArray.length(); i += 3) {
        JSONObject obj = readCountry(inputArray, i);
        outputArray.put(obj);
    }
    System.out.println(outputArray);
}

private static JSONObject readCountry(JSONArray array, int index) {
    JSONObject country = new JSONObject();
    country.put("id", array.getString(index));
    country.put("name", array.getString(index + 1));
    country.put("timezones", readTimeZones(array.getJSONArray(index + 2)));
    return country;
}

private static JSONArray readTimeZones(JSONArray array) {
    JSONArray timezones = new JSONArray();
    JSONObject timezone = new JSONObject();
    timezone.put("id", array.getString(0));
    timezone.put("name", array.getString(1));
    timezones.put(timezone);
    return timezones;
}

如果输入不匹配,您可以添加一些错误处理以优雅地失败,甚至可以尽力恢复。