12

我有一个 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"
            }
        ]
    }
]
4

3 回答 3

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 也可以用来做灵活的解析。

于 2013-09-26T06:17:11.163 回答
5

尝试使用 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 类。相信,他们有足够的接口来恢复你的对象。

于 2013-09-25T01:15:14.700 回答
0

您可以通过首先尝试解析数组然后回退到解析单个对象类来尝试/捕获它吗?

您还可以做一个真正简单的测试并查看您要反序列化的字符串中的第一个非空白字符,如果它是“{”它是一个对象,如果它是一个“[”它是一个数组

于 2013-09-24T22:52:05.157 回答