2014-03-29 149 views
0

嗨,我需要它解析到实际的Java对象之前,找出值在JSON一个键(即type),但我这样做会导致以下情况除外:预计BEGIN_ARRAY但BEGIN_OBJECT位于第1行第2列

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 

的Json

{ 
    "type":1, 
    "password":"[email protected]", 
    "role":"normaluser", 
    "name":"Archana Chatterjee", 
    "username":"a.chatterjee", 
    "designation":"Teacher", 
    "id":"T_02", 
    "age":42 
} 

代码

Type listType = new TypeToken<ArrayList<Pair>>() {}.getType(); 
ArrayList<Pair> list = gson.fromJson(json, listType); 

class Pair { 
    String property; 
    Object value; 
    // has getters and setters 
} 
+0

您的JSON不是数组是一个对象。 – vzamanillo

+0

但我试着用'TypeToken ()'也返回一个空'Pair'对象,即'property'和'value'具有'null'值 – guptakvgaurav

+0

您需要了解Json序列化/反序列化工作。 – vzamanillo

回答

-1

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

 String json3 = "{\"type\":1,\"password\":\"[email protected]\",\"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 for same

 JsonElement elem = jObject.get("type"); 

JsoElement's toString()返回的项的值。 (即类型的值在这里)

 System.out.println(elem); 

输出

1 
0

首先,我建议你看一看Gson docsJSON specs,因为它看起来像你失去了,而...

随着GSON,正常和最简单的分析你的JSON的方法是创建一个Java类的结构,匹配你的JSON的结构。

在这种情况下,你的JSON是一个对象(它是由{ }包围)和含有一些性质(即,typepasswordrole等)。

所以,你需要的是创建具有这些属性(相匹配的名称)的Java类:

class User 
    String type 
    String password 
    String role 
    // ... 

然后你只需要调用GSON,给它一些JSON字符串,并告诉它在哪一类你想要的是JSON被解析到:

User someUser = gson.fromJson(yourJson, User.class); 

编辑:如果你的JSON可能ç绞刑,你不能用一个类来解析它,所以你有几个选择。可能最简单的一种方法是尝试将您的JSON解析为Map结构。

Map是一个对象(如您的JSON是),它包含Key=>Value(例如,'type'=>1)。所以,你可以尝试分析它likt这样的:

Type mapType = new TypeToken< Map<String, String> >() {}.getType(); 
HashMap<String, String> map = gson.fromJson(yourJson, mapType); 

注:这种方法的问题是,作为Java是一种强类型语言,你的JSON必须具有对同一类型(例如,) 。在这种情况下,你的领域'type''age'不是字符串,但整数,但我敢肯定它可以自动将它们转换成字符串......

如果不能,或者如果它真的很重要解析'type''age'整数,你唯一的选择是写一个Custom Deserializer ...

+0

其实我可以接收3种类型的Json,所以哪个json属于哪个类取决于'type'参数。就像如果type是1那么我应该使用A.class,如果type是2然后是B.class。这就是为什么我说我需要在解析实际数据结构之前获得'type'值。 – guptakvgaurav

+0

@GauravGupta,请参阅编辑。 – MikO

相关问题