没有键的json数组的gson模型

时间:2014-10-20 13:42:58

标签: json gson

我有来自客户的以下json:

{
    "id": 1234,
    "delivery_date":  1234567890,

    "actions": [
        [ "foo", true],
        [ "bar", true]
    ],
    "customer":  {
        "id": 12345,
        "company": "",
        "firstname": "John",
        "lastname": "Smith",
        "action": ["dothis", true]
    },
    "childs": [ 123abc2132312312,11232432943493]
}

我想将“actions”数组解析为List<操作> actionList和单个“action”作为Action动作。

class Action {
  String action;
  boolean yesno;
}

将子数组列为List<子>有孩子

class Child{
  String id
}

没有json键可以吗?

2 个答案:

答案 0 :(得分:1)

编辑:

你的行动课还可以,我读错了。

添加完整的课程:

class Delivery {
  Int32 id;
  Int32 delivery_date;
  list<Action> actions;
  Customer customer;
  list<Int32> childs;
}

动作将被解析为内部的参数,童心也是如此。 然后,您还需要创建一个Customers类,这也是其中的一部分。 (或排除它,GSON会忽略它)

这会将int填充到childsActions填入actions

如果确实,childs是字母数字,那么只需将其更改为String。

然后您可以通过

访问它
  Delivery delivery = GSON ... etc
  var x = delivery.actions;  // Actions
  var y = delivery.childs; // Childs

答案 1 :(得分:1)

我用自定义反序列化器解决了我的问题。感谢dzsonni的提示。

在Gson根类中:

private ArrayList<Action> parcel_actions = new ArrayList<Action>();

动作类

class Action {
  String action;
  boolean yesno;
}

反序列化器:

public class ActionDeserializer implements JsonDeserializer<ArrayList<Action>> {

    @Override
    public ArrayList<Action> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        ArrayList<Actions> list = new ArrayList<Action>(){};

        if(json.getAsJsonArray().get(0).isJsonPrimitive()){
            String action = json.getAsJsonArray().get(0).getAsString();
            boolean doIt = json.getAsJsonArray().get(1).getAsBoolean();
            list.add(new Action(action, doIt));
        }
        else {
            for(JsonElement element : json.getAsJsonArray()) {
                String action = element.getAsJsonArray().get(0).getAsString();
                boolean doIt = element.getAsJsonArray().get(1).getAsBoolean();
                list.add(new Action(action, doIt));
            }
        }

        return list;
    }
}

然后将其添加到您的gson

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(new TypeToken<ArrayList<Action>>(){}.getType(), new ActionsDeserializer()); 
Gson gson = builder.create();