【问题标题】:Parsing iterative json objects using retrofit/gson使用改造/gson 解析迭代 json 对象
【发布时间】:2019-02-21 05:37:57
【问题描述】:

我需要连接的服务器向我发送如下信息:

{
  "properties": {
    "prop1": {
      "type": "string",
      "title": "string"
    },
    "prop2": {
      "type": "string",
      "title": "string"
    },
    "prop3": {
      "type": "string",
      "title": "string"
    },
    "prop4": {
      "type": "string",
      "title": "string"
    }
  }
}

显然,服务器发送带有 id 字段的对象数组会更理想,但不幸的是我无法更改它。 “prop”之后的数字可以无限增加(尽管实际上不会超过 50 左右),在 Retrofit 2/GSON 中是否有一种优雅的方式来处理这个问题?还是我需要拦截这个呼叫并每次手动执行?

在一个完美的世界中,我希望得到一个具有 id 字段(1、2、3 等)的“Prop”pojo 数组,或者甚至在一个“prop1”、“prop2”等每个对象中的字段。

【问题讨论】:

  • 如果数组比来 [] 括号不是 json 中的 { } 括号。
  • 如果你用prop[i]解析内部for循环会很容易
  • 你有没有尝试过?

标签: android json gson retrofit2


【解决方案1】:

这是您问题的提示:

你必须像这样创建模型类:

public class PropertiesData {
    public ArrayList<Properties> properties = new ArrayList<>();

    //getters setters


    public ArrayList<Properties> getProperties() {
        return properties;
    }

    public void setProperties(ArrayList<Properties> properties) {
        this.properties = properties;
    }

    public class Properties {
        Map<String, SubProperties> subPropertiesMap = new HashMap<>();

        //getters setters

        public Map<String, SubProperties> getSubPropertiesMap() {
            return subPropertiesMap;
        }

        public void setSubPropertiesMap(Map<String, SubProperties> subPropertiesMap) {
            this.subPropertiesMap = subPropertiesMap;
        }
    }

    public class SubProperties {
        public String type;
        public String title;
        //getters setters

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }
    }
}

您必须创建自定义 Gson Builder:

    Gson gson_gd = new GsonBuilder().registerTypeAdapter(
            PropertiesData.class, new JsonDeserializer<PropertiesData>() {
                @Override
                public PropertiesData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                    JsonObject elements= json.getAsJsonObject();
                    return new Gson().fromJson(elements,
                            PropertiesData.class);
                }
            }
    ).create();

在构建改造实例时使用它:

.setConverter(GsonConverterFactory.create(gson_gd)).build();

我基于提供的 json 创建的所有内容。

希望对你有帮助。

【讨论】:

  • 这让我非常接近,在反序列化器中我实例化了一个新的 Properties 类,然后遍历 json 元素中的所有键并将它们映射到 subPropertiesMap,这就成功了!感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2014-04-23
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多