如何使用 GSON 解析 JSON 响应(不同对象类型)

2023-12-04

问题:解析来自 Foursquare Venues API 的以下响应:

{
    meta: {
        code: 200
    }
    notifications: [
    {
        type: "notificationTray"
        item: {
        unreadCount: 0
        }
    }
    ]
    response: {
        venues: [
        {
            id: "5374fa22498e33ddadb073b3"
            name: "venue 1"
        },
        {
            id: "5374fa22498e33ddadb073b4"
            name: "venue 2"
        }
        ],
        neighborhoods: [ ],
        confident: true
    }
}

The GSON文档网站建议使用 GSON 的解析 API 将响应解析为 JSONArray,然后将每个数组项读入适当的对象或数据类型(示例here)。因此,我最初改用以下实现:

JsonParser parser = new JsonParser();
                try {
                    JSONObject json = new JSONObject(response);
                    JSONArray venues = json.getJSONObject("response").getJSONArray("venues");

                    int arraylengh = venues.length();
                    for(int i=0; i < arraylengh; i++){
                        Log.d(TAG, "The current element is: " + venues.get(i).toString());
                    }
                }
                catch(JSONException e){

                }

上面的代码给了我一个包含所有“场地”的 JSONArray。下一个问题是我不知道如何将“venues”JSONArray 解析/转换为 ArrayList(对于我的自定义 Venue 对象)。

解决方案:正如 JohnUopini 回答中所述,我能够使用以下实现成功解析 JSON:

GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();

JsonParser parser = new JsonParser();
JsonObject data = parser.parse(response).getAsJsonObject();
Meta meta = gson.fromJson(data.get("meta"), Meta.class);
Response myResponse = gson.fromJson(data.get("response"), Response.class);
List<Venue> venues = Arrays.asList(myResponse.getVenues());

使用上面的代码,我能够成功地将“元”以及“响应”JSON 属性解析到我的自定义对象中。

作为参考,下面是我的 Response 类(注意:这些属性被定义为公共用于测试目的。最终的实现应该将这些属性声明为私有并使用 setter/getter 进行封装):

public class Response {

    @SerializedName("venues")
    public Venue[] venues;

    @SerializedName("confident")
    public boolean confident;

    Response(){}
}

注意/反馈:在实施接受的答案的建议后,我在调试过程中多次遇到以下(或类似的)异常消息:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected STRING but was BEGIN_OBJECT

我收到上述异常的原因是因为“venues”JSON 中某些子对象的“类型”与我在自定义 Venue 类中定义此类对象的“类型”不匹配。确保自定义类中的类型与 JSON 具有一一对应关系(即 [ ] 是数组属性,{ } 是对象属性等)。


这是正确的,因为您尝试访问的对象不是数组,您应该执行以下操作:

JsonParser parser = new JsonParser();
JsonObject data = parser.parse(response).getAsJsonObject();
Meta meta = gson.fromJson(data.get("meta"), Meta.class);
Response myResponse = gson.fromJson(data.get("response"), Response.class);

或者您可以为这 3 个对象创建一个包含 3 个类的对象,然后通过 GSON 解析所有内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 GSON 解析 JSON 响应(不同对象类型) 的相关文章

随机推荐

  • 替换标识结束字符的多行

    我有下面的代码 CREATE TABLE Table1 column1 double NOT NULL column2 varchar 60 NULL column3 varchar 60 NULL column4 double NOT N
  • Apache Commons 电子邮件使用 base64 进行编码附加

    我正在尝试通过以下方式发送 base64 编码的文件apache commons mail我似乎无法理解Content Transfer Encoding base64标头应该去的地方 Create the email MultiPartE
  • 使用另一个文件夹中的 git“log”

    我在目录中A 我该如何执行git log对于目录中的 git 存储库B From man git 您可以使用 git dir参数 在传递任何命令之前 git git dir foo bar git log 指定 git目录是必要的 从文档
  • 如何在不同时间向 facebook 请求不同的权限?

    Facebook 建议 在使用 Facebook 登录时 您应该首先向用户请求尽可能少的权限 特别是避免请求发布权限 直到用户需要通过您的网站发布某些内容 https developers facebook com docs faceboo
  • 用于在窗口上打印串行数据的Python代码。

    我对 python 和 pyserial 很陌生 我的电脑安装了带有 pyserial 的 python 2 7 4 我想在我的电脑上的单独窗口上打印串行接收的数据 首先必须打开窗口 然后在该窗口上打印串行数据 这里必须打开一次窗口 并且必
  • 什么会让 git 在 git pull --rebase 期间删除本地文件?

    我正在尝试重现我尝试回答所导致的问题这个问题 In short github 用户尝试这样做git pull rebase并且该用户的本地文件已被删除 我尝试在 github 上重新创建这个场景 但在我的例子中没有删除任何内容 那么如何重现
  • C: printf 一个浮点值

    我想打印一个浮点值 该值在逗号后有 2 个整数和 6 个小数位 如果我只是使用printf f myFloat 我得到了一个被截断的值 我不知道这是否总是发生在 C 语言中 或者只是因为我使用 C 语言作为微控制器 确切地说是 CCS 但在
  • 如何在 Android 中调出锁屏?

    我想在单击按钮时调出设备的锁定屏幕 我搜索了很多并且知道可以通过DevicePolicyManager但不知道该怎么做 我还找到了很多例子 但它们都没有打开锁屏 没有错误 例如this or this 如何使用锁定设备DevicePolic
  • 如何在Python中计算One Class SVM的AUC?

    我在 python 中绘制 OneClassSVM 的 AUC 图时遇到困难 我使用 sklearn 生成混淆矩阵 例如 tp fp fn tn with fn tn 0 from sklearn metrics import roc cu
  • Grunt imagemin正在运行但不缩小

    Image min 运行正常 但我得到 0 个缩小的图像 为什么 在我的终端上运行代码后 grunt imagemin Running imagemin dist imagemin task Minified 0 images saved
  • 如何在 Laravel 5.0 中使用外全连接?

    这是我的控制器 public function lihatpesanansemua ajax if Request ajax hasil DB table pesanan gt join pemesan pemesan id pesanan
  • 解析字段名不一致的JSON字符串

    我在反序列化以下 JSON 结构时遇到问题 每个节点包含一个 ID 和带有值的多语言代码 语言属性的数量并不一致 但我需要这些值作为具有语言字段和值字段的对象列表 id w 312457 eng deep fat frying ger Fr
  • 需要帮助在单个单元格中获取多个值,并在 Excel 中满足条件

    我需要帮助来获取单个单元格中的值并满足条件 我想要单个单元格中的值低于 95 的违约者 e g 如果有动态数组公式 FILTER 和 TEXTJOIN TEXTJOIN CHAR 10 TRUE FILTER A2 A7 E2 E7 lt
  • 如何在 iOS 应用程序中以编程方式创建 PDF 文件?

    如何根据用户操作生成 PDF 文件 See 用石英画画 了解如何创建 PDF 图形上下文 一些注意事项 iPhoneOS注意 如果您想在 iPhone 应用程序中创建 PDF 图形上下文 请确保您还阅读了 在 iPhone OS 中绘制到图
  • 在 C# 中使用 AES 加密

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我似乎找不到使用 AES 128 位加密的清晰示例 有人有一些示例代码吗 如果您只想使用内置加密提供程序 RijndaelMana
  • 注销 WordPress 并重定向到不同的 URL

    我的网站上有一个用于注销 Wordpress 的注销选项 注销后 我想将用户重定向到不同的 URL 我在functions php中使用它 add action wp logout auto redirect external after
  • 使用 PySide 和 QTextEdit 半透明突出显示

    我创建了一个 QTextEdit 对象 下面的代码向当前选定的文本添加随机颜色的突出显示 我需要高光是半透明的 这样我就可以看到高光彼此分层 使用 setAlpha 似乎没有做任何事情 如何设置突出显示的 Alpha 或以其他方式获得半透明
  • 在 Active Directory 中查找用户的管理员记录

    我尝试使用 Active Directory 查找用户经理的 SamAccountName 和电子邮件 我通过搜索在 AD 中找到登录用户 其中 sAMAccountName Domain Account 然后 我检索管理器属性 如下所示
  • 如何隐藏 iPadOS 13 以来出现的 iPad Safari Web App 全屏模式上的新网址栏?

    现在 当通过 Safari 上的 添加到主屏幕 安装 WebApp 时 iPadOS 13 会显示白色 灰色条 即使添加了 apple touch fullscreen 元标记也是如此 该栏包含一个用于调整字体大小和请求桌面站点的菜单 但影
  • 如何使用 GSON 解析 JSON 响应(不同对象类型)

    问题 解析来自 Foursquare Venues API 的以下响应 meta code 200 notifications type notificationTray item unreadCount 0 response venues