Gson-Json에서 형식화 된 ArrayList <T>로 변환


211

Gson 라이브러리를 사용하여 JSON 문자열을 ArrayList사용자 정의 클래스 로 변환하는 방법은 JsonLog무엇입니까? 기본적으로 JsonLog내 Android 앱에서 만든 다양한 종류의 로그 (SMS 로그, 통화 로그, 데이터 로그)로 구현 된 인터페이스 이며, 이 로그는 ArrayList모두 이들의 모음입니다. 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
    }
}

컴파일러가 typed를 참조하고 있다는 것을 이해하지 못하는 것 같습니다 ArrayList. 어떻게해야합니까?


또 다른 접근 방법 은 stackoverflow.com/questions/44589381/… 을 참조하십시오
Pankaj Jaiswal

답변:


515

TypeToken 을 사용하여 json 문자열을 사용자 정의 객체에로드 할 수 있습니다 .

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

선적 서류 비치:

제네릭 형식 T를 나타 냅니다.

Java는 아직 제네릭 형식을 나타내는 방법을 제공하지 않으므로이 클래스는 수행합니다. 클라이언트가 런타임에도 유형 정보를 검색 할 수 있도록이 클래스의 서브 클래스를 작성하도록합니다.

예를 들어에 대한 형식 리터럴을 List<String>만들려면 빈 익명 내부 클래스를 만들 수 있습니다.

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

이 구문은 다음과 같은 와일드 카드 매개 변수가 입력 리터럴 만드는 데 사용할 수 없습니다 Class<?>또는 List<? extends CharSequence>.

코 틀린 :

Kotlin 에서해야 할 경우 다음 과 같이 할 수 있습니다.

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

또는 다양한 대안에 대한 이 답변 을 볼 수 있습니다 .


3
이 접근법을 시도했는데 TypeToken ()이 액세스를 보호한다고 말하는 컴파일 오류가 발생했습니다.
Jonathan

1
@ jonney 나는 같은 문제가 있습니다. 어떤 솔루션?
Zapnologica

15
액세스 오류가 보호되는 경우 { }이전을 제외했습니다..getType()
Zapnologica

@Alex는 먼저 배열을 직렬화 해제 한 다음 해당 배열을 List로 변환하거나 직접 직렬화 해제합니까?
Adnan Ali

홀리 소! 나는 ... 음 ... 아직도 그렇게 생각했을 것입니다. 감사합니다.
John Ward

26

JSON 샘플은 다음과 같습니다.

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

따라서 SharedPrefrences에 모듈의 배열 목록을 저장하려면 다음을 수행하십시오.

1-이 방법을 사용하여 반환 된 배열 목록을 json 형식으로 변환합니다.

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

2- 공유 사전에 저장

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

3- 언제든지 검색하려면 공유 환경 설정에서 JsonString을 가져옵니다.

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

4- 다시 배열 목록으로 변환

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

이 솔루션은 객체의 ArrayList를 구문 분석하려는 경우에도 가능합니다 .Gson Library 를 사용하여 도움이되기를 바랍니다 .


내가 된 SharedPreferences에 대해 알아 보려면 여기를 오지 않았다 -이 불필요한 정보의 많은 나이가 답변을 3 년으로 올바른 솔루션,하지만 본질적으로 동일합니다
Xerus

8

배열을 사용하려면 매우 간단합니다.

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

JsonLog배열로 제공JsonLog[].class


8

코 틀린

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)

또는

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

5

왜 아무도 List에서 JSON 문자열을 변환하는 간단한 방법을 쓰지 않았 습니까?

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

1

gson에 대해서는 확실하지 않지만 Jon과 함께하는 방법입니다 .sample gson을 사용하여 비슷한 방법이 있어야합니다.

{ "플레이어": [ "플레이어 1", "플레이어 2", "플레이어 3", "플레이어 4", "플레이어 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 : 당신이 기대하는 예는 무엇입니까 ..?
arun kongara

0

당신은이 문자열 과 같은합니다.

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

그런 다음 Gson을 통해 ArrayList에 숨길 수 있습니다.

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

귀하의 HotelInfo 클래스는 이렇습니다 .

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
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.