为了账号安全,请及时绑定邮箱和手机立即绑定

解析器适用于某些 ArrayList,抛出 Expected BEGIN_OBJECT

解析器适用于某些 ArrayList,抛出 Expected BEGIN_OBJECT

撒科打诨 2022-11-10 15:16:41
我对此有疑问,但在 Stack Overflow 上阅读了其他问题并最初解决了这些问题。现在我可以在我的客户端和服务器之间发送 JSON 并在客户端中从这个 JSON 创建对象。但是,我不断收到一个特定对象的此错误:client.restaurant = gson.fromJson(obj.get("restaurant"), Restaurant.class); // worksclient.postcodes = gson.fromJson(obj.get("postcodes"), new TypeToken<ArrayList<Postcode>>(){}.getType()); // worksclient.orders = gson.fromJson(obj.get("orders"), new TypeToken<ArrayList<Order>>(){}.getType()); // java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at path $[0].dishes.updateListeners所有 JSON 根据https://jsonlint.com都是有效的。我不知道如何找到有关此问题的更多信息,但我尝试的一件事是我提取了 JSONArrayList<Order> orders并尝试手动解析它:JsonObject testOrder = parser.parse("{\n" +                         "    \"orders\": [\n" +                         "        {\n" +                         "            \"user\": {\n" +                         "                \"userName\": \"Admin\",\n" +                         "                \"password\": \"password\",\n" +                         "                \"address\": \"University Road\",\n" +                         "                \"postcode\": {\n" +                         "                    \"postcodeName\": \"SO17 1BJ\",\n" +                         "                    \"latLong\": {\n" +                         "                        \"lon\": 0.0,\n" +                         "                        \"lat\": 0.0\n" +                         "                    },\n" +                         "                    \"distance\": 0,\n" +                         "                    \"updateListeners\": []\n" +                         "                },\n" +                         "                \"updateListeners\": []\n" +                         "            },\n" +                         "            \"dishes\": {\n" + client.orders = gson.fromJson(testOrder, new TypeToken<ArrayList<Order>>(){}.getType()));但这也不起作用(错误略有不同-- Expected BEGIN_ARRAY but was BEGIN_OBJECT)。
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

所以我认为你的问题是围绕这个:


"dishes": {  

    "Sushi Roll": 5,

    "Side Rice": 2

}

它尝试调用 Order 的方法addDishes(Dish dish, Number quantity)但失败了,因为它有"Sushi Roll"而不是代表Dish. 您需要更新 Json 而不是字符串以具有匹配的构造函数的对象Dish。就像是:


"dishes": {  

    {"name":"Sushi Roll","description":"", "price":0.0, "restockThreshold": 0, "restockAmount":0}: 5,

    {"name":"Side Rice","description":"", "price":0.0, "restockThreshold": 0, "restockAmount":0}: 2

}

一般来说,在处理 Json 时,您需要遵循一些规则。


始终将不带参数的默认构造函数放入数据对象。

尝试使用 getter 和 setter 保留所有集合。


查看完整回答
反对 回复 2022-11-10
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信