首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >预期的BEGIN_ARRAY,但在第1列是BEGIN_OBJECT

预期的BEGIN_ARRAY,但在第1列是BEGIN_OBJECT
EN

Stack Overflow用户
提问于 2014-03-29 20:09:20
回答 2查看 6.1K关注 0票数 0

嗨,在将Json解析为实际的Java之前,我需要找到Json中一个键的值(即type),但这样做会导致以下异常:

代码语言:javascript
运行
复制
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 

Json

代码语言:javascript
运行
复制
{
    "type":1,
    "password":"ac@123",
    "role":"normaluser",
    "name":"Archana Chatterjee",
    "username":"a.chatterjee",
    "designation":"Teacher",
    "id":"T_02",
    "age":42
}

代码语言:javascript
运行
复制
Type listType = new TypeToken<ArrayList<Pair>>() {}.getType();
ArrayList<Pair> list = gson.fromJson(json, listType);

代码语言:javascript
运行
复制
class Pair {
    String property;
    Object value;
    // has getters and setters
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-01 12:55:55

在阅读了之后,我找到了一个更好的解决问题的方法。这里,我需要一个低级别的流解析器来获得JsonObject

代码语言:javascript
运行
复制
        String json3 = "{\"type\":1,\"password\":\"ac@123\",\"role\":\"normaluser\",\"name\":\"Archana Chatterjee\",\"username\":\"a.chatterjee\",\"designation\":\"Teacher\",\"id\":\"T_02\",\"age\":42}";
        JsonParser jParser = new JsonParser();
        JsonObject jObject = (JsonObject) jParser.parse(json3);

现在,JsonObject具有返回键值的能力。javadoc表示相同

代码语言:javascript
运行
复制
        JsonElement elem = jObject.get("type");

JsoElement's toString()返回键的值。(即此处类型的值)

代码语言:javascript
运行
复制
        System.out.println(elem);

输出

代码语言:javascript
运行
复制
1
票数 -1
EN

Stack Overflow用户

发布于 2014-03-29 23:16:51

首先,我建议你看一看Gson文档JSON规格,因为你看起来很迷茫.

使用Gson,解析JSON的最常用和最简单的方法是创建一个与JSON结构相匹配的Java类结构。

在本例中,JSON是一个对象(它被{ }包围),包含许多属性(例如,typepasswordrole等)。

因此,您需要创建一个具有这些属性的Java类(与名称匹配):

代码语言:javascript
运行
复制
class User
  String type
  String password
  String role
  // ...

然后只需调用Gson,给它一些JSON字符串,并告诉它您希望将该JSON解析到哪个类中:

代码语言:javascript
运行
复制
User someUser = gson.fromJson( yourJson, User.class );

编辑:如果您的JSON可能会更改,您就不能使用一个类来解析它,所以您有几个选项。可能最简单的方法是尝试将JSON解析为Map结构。

Map是一个对象(与您的JSON一样),它包含对Key=>Value (例如,'type'=>1)。因此,您可以尝试解析它,如下所示:

代码语言:javascript
运行
复制
Type mapType = new TypeToken< Map<String, String> >() {}.getType();
HashMap<String, String> map = gson.fromJson( yourJson, mapType );

注意:这种方法的问题是,由于Java是一种强类型语言,所以您的JSON必须有相同类型的对(例如)。在本例中,您的字段'type''age'不是字符串,而是整数,但我确信它可以自动将它们转换为字符串.

如果它不能,或者如果将'type''age'解析为整数非常重要,那么您唯一的选择就是编写一个自定义反序列化器.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22736272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档