使用GSON解析json对象与json数组

时间:2013-09-24 22:50:03

标签: java android gson

我有一个JSON,它可以是单个对象,也可以是同一个对象的数组。有没有办法使用Gson解析这些数据,它将区分单个对象与数组?

我目前唯一的解决方案是手动解析json并使用try catch包围它。首先,我将尝试将其解析为单个对象,如果失败,它将抛出异常,然后我将尝试将其解析为数组。

我不想手动解析它......这将永远带我。 以下是对正在发生的事情的看法。

public class ObjectA implements Serializable{

    public String variable;
    public ObjectB[] objectb; //or ObjectB objectb;

    public ObjectA (){}
}

这是可以是数组或单个对象的对象。

public class ObjectB implements Serializable{

    public String variable1;
    public String variable2;

    public ObjectB (){}
}

然后在与json响应交互时。我这样做。

Gson gson = new Gson();
ObjectA[] objectList = gson.fromJson(response, ObjectA[].class);

当序列化ObjectA数组时,json包含ObjectB的数组或单个对象。

[
    {
        "variable": "blah blah",
        "objectb": {
            "variable1": "1",
            "variable2": "2"
        }
    },
    {
        "variable": "blah blah",
        "objectb": {
            "variable1": "1",
            "variable2": "2"
        }
    },
    {
        "variable": "blah blah",
        "objectb": [
            {
                "variable1": "1",
                "variable2": "2"
            },
            {
                "variable1": "1",
                "variable2": "2"
            }
        ]
    }
]

3 个答案:

答案 0 :(得分:8)

我刚刚将ObjectB[]更改为List<ObjectB>ObjectA声明。

ArrayList<ObjectA> la = new ArrayList<ObjectA>();
List<ObjectA> list = new Gson().fromJson(json, la.getClass());

for (Object a : list)
{
   System.out.println(a);
}

这是我的结果:

{variable=blah blah, objectb={variable1=1, variable2=2}}
{variable=blah blah, objectb={variable1=1, variable2=2}}
{variable=blah blah, objectb=[{variable1=1, variable2=2}, {variable1=1, variable2=2}]}

我认为在完整的泛型时代,如果你没有特殊的需求,你可以从数组切换到列表,你有许多好处,Gson也可以使用它来进行灵活的解析。

答案 1 :(得分:2)

尝试使用com.google.gson.JsonParser。

        String jsonString = "object json representation";
        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(jsonString);

        if (jsonElement.isJsonArray()) {
            // some logic
        }

使用JsonElement实例获取对象的方法有多种,例如 - 只需使用com.google.gson.Gson方法:

public <T>  T fromJson(com.google.gson.JsonElement json, java.lang.Class<T> classOfT) throws com.google.gson.JsonSyntaxException 

public <T>  T fromJson(com.google.gson.JsonElement json, java.lang.reflect.Type typeOfT) throws com.google.gson.JsonSyntaxException

因此,研究JsonElement,JsonArray,JsonPrimitive,JsonNull和JsonObject类。相信,他们有足够的界面来恢复你的对象。

答案 2 :(得分:0)

首先尝试解析数组,然后再回到解析单个对象类,可以尝试/捕获它吗?

你也可以进行一个真正的简单测试,并查看你要解串的字符串中的第一个非空格字符,如果它是“{”它是单个对象,如果它是“[”它是一个数组