我有来自客户的以下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键可以吗?
答案 0 :(得分:1)
编辑:
你的行动课还可以,我读错了。
添加完整的课程:
class Delivery {
Int32 id;
Int32 delivery_date;
list<Action> actions;
Customer customer;
list<Int32> childs;
}
动作将被解析为内部的参数,童心也是如此。 然后,您还需要创建一个Customers类,这也是其中的一部分。 (或排除它,GSON会忽略它)
这会将int
填充到childs
和Actions
填入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();