Gson - 从Json转换为类型化ArrayList <T>

Mat*_*ros 198 java android json gson

使用Gson库,如何将JSON字符串转换ArrayList为自定义类JsonLog?基本上,JsonLog是由我的Android应用程序制作的不同类型的日志实现的接口 - 短信日志,呼叫日志,数据日志 - 这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
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎编译器不理解我指的是打字ArrayList.我该怎么办?

Ale*_*lex 487

您可以使用TypeToken将json字符串加载到自定义对象中.

logs = gson.fromJson(br, new TypeToken<List<JsonLog>>(){}.getType());
Run Code Online (Sandbox Code Playgroud)

  • 如果你得到了受保护的访问错误,你在`.getType()`之前省略了`{}` (15认同)
  • 试过这种方法,我得到一个编译错误,说TypeToken()只有受保护的访问权限 (3认同)

小智 25

您的JSON示例是:

{
    "status": "ok",
    "comment": "",
    "result": {
    "id": 276,
    "firstName": "mohamed",
    "lastName": "hussien",
    "players": [
            "player 1",
            "player 2",
            "player 3",
            "player 4",
            "player 5"
    ]
}
Run Code Online (Sandbox Code Playgroud)

所以如果你想在SharedPrefrences中保存模块的arraylist,那么:

1-将使用此方法将返回的arraylist转换为json格式

public static String toJson(Object jsonObject) {
    return new Gson().toJson(jsonObject);
}
Run Code Online (Sandbox Code Playgroud)

2-将其保存在共享的prefreneces中

PreferencesUtils.getInstance(context).setString("players", toJson((.....ArrayList you want to convert.....)));
Run Code Online (Sandbox Code Playgroud)

3-在任何时候检索它从共享首选项获取JsonString

String playersString= PreferencesUtils.getInstance(this).getString("players");
Run Code Online (Sandbox Code Playgroud)

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());
Run Code Online (Sandbox Code Playgroud)

如果你想解析Objects的ArrayList,这个解决方案也可行.希望它能帮助你使用Gson Library.


mur*_*glu 9

科特林

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)
Run Code Online (Sandbox Code Playgroud)

或者

val playerArray = Gson().fromJson(json, Array<Player>::class.java)
Run Code Online (Sandbox Code Playgroud)


小智 8

如果您想从 Json 转换为类型化 ArrayList ,则指定列表中包含的对象的类型是错误的。正确的语法如下:

 Gson gson = new Gson(); 
 List<MyClass> myList = gson.fromJson(inputString, ArrayList.class);
Run Code Online (Sandbox Code Playgroud)


Far*_*ukT 7

为什么没有人写这种在 List 中转换 JSON 字符串的简单方法

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


Shi*_*din 7

比方说,你有一个像这样的字符串

"[{"id":2550,"cityName":"Langkawi","hotelName":"favehotel Cenang Beach - Langkawi","hotelId":"H1266070"},
{"id":2551,"cityName":"Kuala Lumpur","hotelName":"Metro Hotel Bukit Bintang","hotelId":"H835758"}]"
Run Code Online (Sandbox Code Playgroud)

然后你可以通过Gson将其转换为ArrayList

var hotels = Gson().fromJson(historyItem.hotels, Array<HotelInfo>::class.java).toList()
Run Code Online (Sandbox Code Playgroud)

你的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
)
Run Code Online (Sandbox Code Playgroud)


小智 6

如果要使用数组,这很简单。

logs = gson.fromJson(br, JsonLog[].class); // line 6
Run Code Online (Sandbox Code Playgroud)

提供JsonLog为数组JsonLog[].class