【问题标题】:gson model for json array without key没有键的json数组的gson模型
【发布时间】:2014-10-20 13:42:57
【问题描述】:

我有来自我们客户的以下 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 键,这可能吗?

【问题讨论】:

  • 结构设置好了吗?我看不出在动作中有两个元素数组的任何原因
  • 您可以将List<Child> 设为Action 的参数。它应该相应地填充。如果您想将它们分开,则创建另一个用于 GSON 的类,然后将其拆分。
  • 是的,结构已设置。我已经要求将 json 更改为键值对 - 没有成功:(
  • 你确定吗?数字周围没有引号。如果您想将其存储为字符串,则应在 GSON 之后进行。查看下面的代码,看看它是否有效
  • 要做到这一点,我建议您编写一个反序列化器,并在相应的类 Action 和 Child 中注册,并拥有一个持有这两个类的父实体。这样在解析整个 json 的时候,gson 会自动分配你刚才写的反序列化器。如果您有兴趣,我可以提供详细信息

标签: json gson


【解决方案1】:

编辑:

你的动作课没问题,我看错了。

添加一个完整的类:

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

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

这会将ints 填充到childsActionsactions

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

然后您可以通过以下方式访问它,

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

【讨论】:

  • gson怎么会自动把上面的json解析成这个类呢? Childs 甚至不是操作键的一部分
  • @dzsonni 你说得对,我略过了一个重要方面。他需要将整个事情作为一个班级进行 GSON。
  • 谢谢,是的,这是一种可能,但我想要一个完全干净的解决方案,所以我使用自定义反序列化器进行了尝试。
【解决方案2】:

我使用自定义反序列化器自行解决了这个问题。感谢 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();

【讨论】:

  • 干得好。看起来很理想。 :)
猜你喜欢
  • 2022-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多