当前位置: 首页 > 知识库问答 >
问题:

Gson-从Json转换为类型化数组列表

叶文博
2023-03-14

使用Gson库,如何将JSON字符串转换为自定义类JSONLOGArrayList?基本上,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
    }
}

似乎编译器不明白我指的是类型化的arraylist。我该怎么办?

共有2个答案

冯和硕
2023-03-14

您的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-将其保存在共享的prefreneces中

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库对您有所帮助。

国兴文
2023-03-14

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

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

文档:

表示泛型类型T。

Java还没有提供表示泛型类型的方法,所以这个类提供了。强制客户端创建该类的子类,从而即使在运行时也能检索类型信息。

例如,要为list 创建类型文字,可以创建一个空的匿名内部类:

TypeToken >list=new TypeToken >(){};

此语法不能用于创建具有通配符参数的类型文字,如class<?>list<?扩展charSequence>

科特林:

如果你需要在Kotlin做,你可以这样做:

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

或者您可以看到各种备选方案的答案。

 类似资料:
  • 问题内容: 使用Gson库,如何将JSON字符串转换为自定义类的?基本上,这是一个由我的Android应用制作的各种日志(SMS日志,通话日志,数据日志)实现的界面,这是所有这些的集合。我在第6行中不断收到错误消息。 看来编译器无法理解我指的是typed 。我该怎么办? 问题答案: 您可以使用TypeToken将json字符串加载到自定义对象中。 说明文件: 表示泛型类型 牛逼 。 Java尚未提

  • 我无法将JSON数组转换为数组。以下是我使用的JSON: 类为: 并且尝试以下代码会导致: com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_OBJECT但BEGIN_ARRAY在第1行第2列路径$ 代码:

  • 问题内容: 我有一些奇怪的JSON,如: 基于某个字段,数组中的对象是某种类型。使用Gson,我的想法是要拥有一个TypeAdapterFactory,它将那些特定类型的委托适配器发送到TypeAdapter,但是我一直挂在理解读取“ type”字段以了解要创建哪种类型的一种好方法上。在TypeAdapter中 会假设“类型”字段在我的JSON中排在首位。有消除这种假设的不错方法吗? 问题答案:

  • 问题内容: 目前,我正在使用带有webView前端的本机android应用程序。 我有类似的东西: 在活动中 我做了一个dataObject数组,比如dataObject x [5]; 现在,我想将这5个dataObject作为JSON的回调函数传递给我的javascript webView接口。 我浏览了互联网,似乎大多数教程都在谈论如何转换。没有太多关于。我找到了一个教会我的人,可以工作。 但

  • 问题内容: 那是我的JSON数组,但我想将fruits字符串中的所有值转换为Python列表。正确的做法是什么? 问题答案: 您拥有了所需的一切。将是一个字典,将是一个列表