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

时间:2012-09-12 08:29:40

标签: java android json gson

使用Gson库,如何将JSON字符串转换为自定义类ArrayList的{​​{1}}?基本上,JsonLog是由我的Android应用程序制作的不同类型的日志实现的接口 - 短信日志,呼叫日志,数据日志 - 这个JsonLog是所有日志的集合。我在第6行继续收到错误。

ArrayList

似乎编译器不理解我指的是键入的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 } } 。我该怎么办?

9 个答案:

答案 0 :(得分:447)

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

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

答案 1 :(得分:23)

您的JSON示例是:

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

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

1-将使用此方法将您返回的arraylist转换为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

答案 2 :(得分:5)

  

科特琳

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)

OR

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

答案 3 :(得分:5)

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

int16_t

答案 4 :(得分: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);
                }           
    }
}

答案 5 :(得分:1)

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

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

JsonLog提供为数组JsonLog[].class

答案 6 :(得分: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
)

答案 7 :(得分:0)

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

|    | a   | b1          | b2            | b3             | c1          | c2            | c3             |
|---:|:----|:------------|:--------------|:---------------|:------------|:--------------|:---------------|
|  0 | jon | ('age', 12) | ('gender', 1) | ('marital', 1) | ('age', 12) | ('gender', 1) | ('marital', 1) |
|  1 | san | ('age', 34) | ('gender', 1) | ('marital', 2) | ('age', 34) | ('gender', 1) | ('marital', 2) |
|  2 | el  | ('age', 14) | ('gender', 2) | ('marital', 1) | ('age', 14) |               |                |

答案 8 :(得分:0)

科特林

val userList = Gson().fromJson(mList, Array< User >::class.java).toList()

Java

Gson gson = new Gson(); 
 
Type userListType = new TypeToken<ArrayList<User>>(){}.getType();
 
ArrayList<User> userArray = gson.fromJson(userJson, userListType);