使用任意名称

时间:2017-05-22 16:20:08

标签: java json gson retrofit2 android

我目前正在尝试解析像这样的JSON

{
  "images": {
    "svg": {
      "arbitrary_name_1": {
        "src": "https://www.google.com"
      },
      "arbitrary_name_2": {
        "src": "https://www.google.com"
      }
    },
    "png": {
      "arbitrary_name_3": {
        "src": "https://www.google.com"
      }
    }
  }
}

正如您所看到的,那里有一些任意的节点名称。我想要获得的是Map<String, String>节点 svg png ,其中键是任意名称,值应为{{1} }字符串。所以我的Images Bean应该是这样的:

src

开箱即用,这不起作用,这就是我使用自定义public class Images { @SerializedName("svg") public Map<String, String> svg; @SerializedName("png") public Map<String, String> png; } 的原因。经过几个小时的试验和错误,我找不到解决方案,但我实施的所有解决方案都无法正常工作。只有一个:

JsonDeserializer

这看起来不对,错了,最重要的是效率很低。如果有人可以帮助我并告诉我我缺少什么以及推荐/正确的方法,我会很高兴。谢谢!

2 个答案:

答案 0 :(得分:0)

我认为,您应该将JSON视为地图。

上课

public class Images {
    private Map<String, String> svg;
    private Map<String, String> png;

    public Map<String, String> getSvg() {
        return svg;
    }

    public void setSvg(Map<String, String> svg) {
        this.svg = svg;
    }

    public Map<String, String> getPng() {
        return png;
    }

    public void setPng(Map<String, String> png) {
        this.png = png;
    }
}

使用类似的东西:

public void parseImages() throws ParseException {
    String json = ...........;

    JSONParser parser = new JSONParser();
    JSONObject jsonObject = (JSONObject) parser.parse(json);

    Images images = new Images();
    images.setSvg(getNames(jsonObject, "svg"));
    images.setPng(getNames(jsonObject, "png"));

}

private Map<String, String> getNames(JSONObject jsonObject, String itemName) {
    Map<String, String> rezMap = new HashMap<>();

    Map<String, Object> item =
            (Map<String, Object>)
                    ((Map<String, Object>)jsonObject.get("images")).get(itemName);

    for(Map.Entry<String, Object> entry : item.entrySet()) {
        rezMap.put(entry.getKey(), 
                (String)((Map<String, Object>)entry.getValue()).get("src"));
    }

    return rezMap;
}

答案 1 :(得分:0)

好像我想出了一个解决方案 - 最后......(虽然我必须添加一个像chsdk所提到的新类)

解串器

Default

Images.class

@Override
public ImagePojo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    Map<String, String> map = new HashMap<>();

    for (Map.Entry<String, JsonElement> element : json.getAsJsonObject().entrySet()) {
        JsonObject jsonObject1 = element.getValue().getAsJsonObject();
        for (Map.Entry<String, JsonElement> jsonElementEntry1 : jsonObject1.entrySet()) {
            String src = jsonElementEntry1.getValue().getAsString();
            map.put(element.getKey(), src);
        }
    }
    return new ImagePojo(map);
}

ImagePojo.class

public class Images {

    @SerializedName("svg")
    public ImagePojo svg;
    @SerializedName("png")
    public ImagePojo png;

}