Разбор массива JSON в java.util.List с 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
...
Каков самый простой способ сделать это?
Ответы
Ответ 1
Определенно, самый простой способ сделать это - использовать функцию разбора по умолчанию 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
.
Вы можете взглянуть на документацию API Gson.
Ответ 2
Ниже код использует 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();
}
}
}
OUTPUT
List size is : 4
List Elements are : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]
Ответ 3
Я прочитал решение с официального сайта 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
Ответ 4
Мне удалось получить сопоставление списка, используя только @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);
}
Ответ 5
Проверьте это, я считаю, что это то, что вам нужно.
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);
}
}
}