Gson - chuyển đổi từ Json thành một ArrayList được gõ <T>


211

Sử dụng thư viện Gson, làm cách nào để chuyển đổi một chuỗi JSON thành một ArrayListlớp tùy chỉnh JsonLog? Về cơ bản, JsonLoglà một giao diện được triển khai bởi các loại nhật ký khác nhau được tạo bởi ứng dụng Android của tôi - nhật ký SMS, nhật ký cuộc gọi, nhật ký dữ liệu - và đây ArrayListlà tập hợp của tất cả chúng. Tôi tiếp tục nhận được một lỗi trong dòng 6.

public static void log(File destination, JsonLog log) {
    Collection<JsonLog> logs = null;
    if (destination.exists()) {
        Gson gson = new Gson();
        BufferedReader br = new BufferedReader(new FileReader(destination));
        logs = gson.fromJson(br, ArrayList<JsonLog>.class); // line 6
        // logs.add(log);
        // serialize "logs" again
    }
}

Có vẻ như trình biên dịch không hiểu tôi đang đề cập đến một kiểu gõ ArrayList. Tôi làm gì?


Ngoài ra, vui lòng tham khảo stackoverflow.com/questions/44589381/ cho một cách tiếp cận khác
Pankaj Jaiswal

Câu trả lời:


515

Bạn có thể sử dụng TypeToken để tải chuỗi json vào một đối tượng tùy chỉnh.

logs = gson.fromJson(br, new TypeToken<List<JsonLog>>(){}.getType());

Tài liệu:

Đại diện cho một kiểu generic T .

Java chưa cung cấp một cách để biểu diễn các kiểu chung, vì vậy lớp này có. Buộc các máy khách tạo một lớp con của lớp này cho phép truy xuất thông tin loại ngay cả khi chạy.

Ví dụ: để tạo một kiểu chữ cho List<String>, bạn có thể tạo một lớp bên trong ẩn danh trống:

TypeToken<List<String>> list = new TypeToken<List<String>>() {};

Cú pháp này không thể được sử dụng để tạo ra các kiểu chữ có tham số ký tự đại diện, chẳng hạn như Class<?>hoặc List<? extends CharSequence>.

Kotlin:

Nếu bạn cần làm điều đó trong Kotlin, bạn có thể làm như thế này:

val myType = object : TypeToken<List<JsonLong>>() {}.type
val logs = gson.fromJson<List<JsonLong>>(br, myType)

Hoặc bạn có thể thấy câu trả lời này cho các lựa chọn thay thế khác nhau.


3
đã thử cách tiếp cận này và tôi đã gặp một lỗi biên dịch cho biết TypeToken () chỉ bảo vệ quyền truy cập
Jonathan

1
@jonney Mình có vấn đề tương tự. Giải pháp nào?
Zapnologica

15
nếu bạn nhận được lỗi truy cập được bảo vệ, bạn đã bỏ qua { }trước đó.getType()
Zapnologica

@Alex trước tiên nó giải tuần tự hóa thành một Mảng sau đó Mảng đó được chuyển đổi thành Danh sách hay nó trực tiếp giải trừ thành Danh sách?
Adnan Ali

Con bò hoàn toàn! Tôi sẽ hình dung rằng ... cũng ... không bao giờ. Cảm ơn bạn.
John Ward

26

Mẫu JSON của bạn là:

{
    "status": "ok",
    "comment": "",
    "result": {
    "id": 276,
    "firstName": "mohamed",
    "lastName": "hussien",
    "players": [
            "player 1",
            "player 2",
            "player 3",
            "player 4",
            "player 5"
    ]
}

vì vậy nếu bạn muốn lưu danh sách các mô-đun trong SharedPrefrences của mình thì:

1- sẽ chuyển đổi danh sách mảng trả về của bạn cho định dạng json bằng phương thức này

public static String toJson(Object jsonObject) {
    return new Gson().toJson(jsonObject);
}

2- Lưu nó trong các phân chia chung

PreferencesUtils.getInstance(context).setString("players", toJson((.....ArrayList you want to convert.....)));

3- để truy xuất nó bất cứ lúc nào, hãy lấy JsonString từ các tùy chọn được chia sẻ như thế

String playersString= PreferencesUtils.getInstance(this).getString("players");

4- chuyển đổi nó một lần nữa vào danh sách mảng

public static Object fromJson(String jsonString, Type type) {
    return new Gson().fromJson(jsonString, type);
}

ArrayList<String> playersList= (ArrayList<String>) fromJson(playersString,
                    new TypeToken<ArrayList<String>>() {
                    }.getType());

giải pháp này cũng có thể thực hiện được nếu bạn muốn phân tích ArrayList của các đối tượng Hy vọng nó sẽ giúp bạn bằng cách sử dụng Thư viện Gson .


Đây là giải pháp chính xác, nhưng về cơ bản giống như câu trả lời cũ hơn ba năm với rất nhiều thông tin không cần thiết - Tôi đã không đến đây để tìm hiểu về sharedPreferences
Xerus

8

Nếu bạn muốn sử dụng Mảng, nó khá đơn giản.

logs = gson.fromJson(br, JsonLog[].class); // line 6

Cung cấp JsonLogdưới dạng một mảngJsonLog[].class


8

Kotlin

data class Player(val name : String, val surname: String)

val json = [
  {
    "name": "name 1",
    "surname": "surname 1"
  },
  {
    "name": "name 2",
    "surname": "surname 2"
  },
  {
    "name": "name 3",
    "surname": "surname 3"
  }
]

val typeToken = object : TypeToken<List<Player>>() {}.type
val playerArray = Gson().fromJson<List<Player>>(json, typeToken)

HOẶC LÀ

val playerArray = Gson().fromJson(json, Array<Player>::class.java)

5

Tại sao không ai viết cách đơn giản này để chuyển đổi chuỗi JSON trong Danh sách ?

List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].class));

1

Tôi không chắc chắn về gson nhưng đây là cách bạn làm điều đó với Jon.sample hy vọng phải có cách tương tự bằng cách sử dụng gson

{"Người chơi": ["người chơi 1", "người chơi 2", "người chơi 3", "người chơi 4", "người chơi 5"]}

===============================================

import java.io.FileReader;
import java.util.List;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class JosnFileDemo {

    public static void main(String[] args) throws Exception
    {
        String jsonfile ="fileloaction/fileName.json";


                FileReader reader = null;
                JSONObject jsb = null;
                try {
                    reader = new FileReader(jsonfile);
                    JSONParser jsonParser = new JSONParser();
                     jsb = (JSONObject) jsonParser.parse(reader);
                } catch (Exception e) {
                    throw new Exception(e);
                } finally {
                    if (reader != null)
                        reader.close();
                }
                List<String> Players=(List<String>) jsb.get("Players");
                for (String player : Players) {
                    System.out.println(player);
                }           
    }
}

@ Sagar Zala: ví dụ nào bạn đang mong đợi ..?
arun kongara

0

Bạn có một chuỗi như thế này.

"[{"id":2550,"cityName":"Langkawi","hotelName":"favehotel Cenang Beach - Langkawi","hotelId":"H1266070"},
{"id":2551,"cityName":"Kuala Lumpur","hotelName":"Metro Hotel Bukit Bintang","hotelId":"H835758"}]"

Sau đó, bạn có thể chuyển đổi nó thành ArrayList thông qua Gson như

var hotels = Gson().fromJson(historyItem.hotels, Array<HotelInfo>::class.java).toList()

Lớp HotelInfo của bạn sẽ thích điều này.

import com.squareup.moshi.Json

data class HotelInfo(

    @Json(name="cityName")
    val cityName: String? = null,

    @Json(name="id")
    val id: Int? = null,

    @Json(name="hotelId")
    val hotelId: String? = null,

    @Json(name="hotelName")
    val hotelName: String? = null
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.