2013-08-31 74 views
72

Tôi có một JsonObject tên "mapping" với nội dung sau:Parsing JSON mảng vào java.util.List với Gson

{ 
    "client": "127.0.0.1", 
    "servers": [ 
     "8.8.8.8", 
     "8.8.4.4", 
     "156.154.70.1", 
     "156.154.71.1" 
    ] 
} 

Tôi biết tôi có thể nhận được các mảng "servers" với:

mapping.get("servers").getAsJsonArray() 

Và bây giờ tôi muốn phân tích cú pháp đó JsonArray thành một số java.util.List ...

Cách dễ nhất để làm điều này là gì?

+1

có thể trùng lặp của [Cách dễ dàng để thay đổi Iterable vào Bộ sưu tập] (http://stackoverflow.com/q/6416706/978917) hoặc [Chuyển đổi Iterator thành ArrayList] (http://stackoverflow.com/q/10117026/978917). – ruakh

+0

@ruakh có nhiều khác biệt giữa câu hỏi đó và câu hỏi này. Cái này liên quan đến 'Gson'. –

+0

@AbelMelquiadesCallejo có một cái nhìn tại answer.I hy vọng nó sẽ giải quyết vấn đề của bạn. – Prateek

Trả lời

201

Chắc chắn là cách dễ nhất để làm điều đó là sử dụng chức năng phân tích cú pháp mặc định Gson của fromJson().

Có một triển khai chức năng này phù hợp khi bạn cần deserialize vào bất kỳ ParameterizedType (ví dụ: bất kỳ List), là fromJson(JsonElement json, Type typeOfT).

Trong trường hợp của bạn, bạn chỉ cần để có được những Type của một List<String> và sau đó phân tích các mảng JSON vào Type rằng, như thế này:

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

Trong trường hợp của bạn yourJson là một JsonElement, nhưng nó cũng có thể là String, bất kỳ Reader hoặc JsonReader nào.

Bạn có thể muốn xem Gson API documentation.

+5

'Loại' có thể được tìm thấy trong gói nào? –

+8

'Loại' là một giao diện tích hợp Java nằm trong gói' java.lang.reflect' – MikO

+0

Tôi đã phải sử dụng 'getString()' thay vì 'get()' hoặc '.fromJson()' khác. – lenooh

-2

Kiểm tra điều này, tôi tin rằng đây là những gì bạn cần.

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

Mã dưới đây đang sử dụng com.google.gson.JsonArray. Tôi đã in số lượng phần tử trong danh sách cũng như các yếu tố trong Danh sách

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] 
0

tôi đọc giải pháp từ trang web chính thức của Gson tại here

Và mã này dành cho bạn:

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

Kết quả hiển thị trên màn hình:

8.8.8.8 
8.8.4.4 
156.154.70.1 
156.154.71.1 
+0

cùng một câu trả lời như trên - vẫn sử dụng phương thức tĩnh 'new Gson(). FromJson()' –

0

tôi đã có thể để có được danh sách ánh xạ để làm việc chỉ bằng cách sử dụng @SerializedName cho tất cả các trường .. không có logic nào xung quanh Type là cần thiết.

Chạy mã - trong bướC# 4 dưới đây - thông qua trình gỡ lỗi, tôi có thể quan sát rằng đối tượng List<ContentImage> mGalleryImages dân cư với các dữ liệu JSON

Dưới đây là một ví dụ:

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. lớp Java với Danh mục

public class FocusArea { 

    @SerializedName("name") 
    private String mName; 

    @SerializedName("gallery") 
    private List<ContentImage> mGalleryImages; 
} 

3. lớp Java cho các mục Danh sách

public class ContentImage { 

    @SerializedName("description") 
    private String mDescription; 

    @SerializedName("photo_url") 
    private String mPhotoUrl; 

    // getters/setters .. 
} 

đang 4. Java xử lý JSON

for (String key : focusAreaKeys) { 

     JsonElement sectionElement = sectionsJsonObject.get(key); 
     FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class); 
    } 
Các vấn đề liên quan