Разбор массива JSON на java.утиль.Список с Gson
у меня есть JsonObject имени "mapping" следующего содержания:
{
"client": "127.0.0.1",
"servers": [
"8.8.8.8",
"8.8.4.4",
"156.154.70.1",
"156.154.71.1"
]
}
Я знаю, что могу получить массив "servers" С:
mapping.get("servers").getAsJsonArray()
и теперь я хочу разобрать это JsonArray на java.util.List...
какой самый простой способ сделать это?
5 ответов:
определенно самый простой способ сделать это-использовать функцию синтаксического анализа по умолчанию Gson
fromJson().существует реализация этой функции, подходящая для того, когда вам нужно десериализоваться в любой
ParameterizedType(напр., ниList), которая составляетfromJson(JsonElement json, Type typeOfT).в вашем случае, вам просто необходимо получить
TypeнаList<String>а затем разобрать массив JSON в этоType, как это:import java.lang.reflect.Type; import com.google.gson.reflect.TypeToken; JsonElement yourJson = mapping.get("servers"); Type listType = new TypeToken<List<String>>() {}.getType(); List<String> yourList = new Gson().fromJson(yourJson, listType);в вашем случае
yourJsonэтоJsonElement, но это также может бытьString, либоReaderилиJsonReader.вы можете взглянуть на Gson API documentation.
ниже код использует
com.google.gson.JsonArray. Я напечатал количество элементов в списке, а также элементы в спискеimport java.util.ArrayList; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class Test { static String str = "{ "+ "\"client\":\"127.0.0.1\"," + "\"servers\":[" + " \"8.8.8.8\"," + " \"8.8.4.4\"," + " \"156.154.70.1\"," + " \"156.154.71.1\" " + " ]" + "}"; public static void main(String[] args) { // TODO Auto-generated method stub try { JsonParser jsonParser = new JsonParser(); JsonObject jo = (JsonObject)jsonParser.parse(str); JsonArray jsonArr = jo.getAsJsonArray("servers"); //jsonArr. Gson googleJson = new Gson(); ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class); System.out.println("List size is : "+jsonObjList.size()); System.out.println("List Elements are : "+jsonObjList.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }выход
List size is : 4 List Elements are : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]
Я прочитал решение с официального сайта Gson по адресу здесь
и этот код:
String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}"; JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class); JsonArray jsonArray = jsonObject.getAsJsonArray("servers"); String[] arrName = new Gson().fromJson(jsonArray, String[].class); List<String> lstName = new ArrayList<>(); lstName = Arrays.asList(arrName); for (String str : lstName) { System.out.println(str); }показать результат на мониторе:
8.8.8.8 8.8.4.4 156.154.70.1 156.154.71.1
я смог получить отображение списка для работы только с помощью
@SerializedNameдля всех полей.. никакой логики вокругTypeбыло необходимо.выполняется код - в шаге #4 ниже - через отладчик, я могу наблюдать, что
List<ContentImage> mGalleryImagesобъект, заполненный данными JSONвот пример:
1. JSON
{ "name": "Some House", "gallery": [ { "description": "Nice 300sqft. den.jpg", "photo_url": "image/den.jpg" }, { "description": "Floor Plan", "photo_url": "image/floor_plan.jpg" } ] }
2. Java-класс с Список
public class FocusArea { @SerializedName("name") private String mName; @SerializedName("gallery") private List<ContentImage> mGalleryImages; }
3. Класс Java для элементов списка
public class ContentImage { @SerializedName("description") private String mDescription; @SerializedName("photo_url") private String mPhotoUrl; // getters/setters .. }
4. Код Java, который обрабатывает JSON
for (String key : focusAreaKeys) { JsonElement sectionElement = sectionsJsonObject.get(key); FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class); }
проверить это, я считаю, что это то, что вам нужно.
public class Test { public static void main(String[] args) { // this part is just to create the JSON object in question, so I am sure you are already having it. JsonObject mappings = new JsonObject(); JsonElement e = new JsonPrimitive("127.0.0.1"); mappings.add("client", e); JsonArray servers = new JsonArray(); JsonElement s1 = new JsonPrimitive("8.8.8.8"); JsonElement s2 = new JsonPrimitive("8.8.4.4"); JsonElement s3 = new JsonPrimitive("156.154.70.1"); JsonElement s4 = new JsonPrimitive( "156.154.71.1"); servers.add(s1); servers.add(s2); servers.add(s3); servers.add(s4); mappings.add("servers", servers); // json creation ends. // split the resultant string based on comma and then convert the resultant array into a list. String[] split = mappings.get("servers").getAsJsonArray().toString().split(","); List<String> myList = new ArrayList<String>(); Collections.addAll(myList, split); // again the following part is to demonstrate that the strings were populated in the list. for(String l : myList){ System.out.println(l); } } }
Comments