我目前正在尝试解析像这样的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
这看起来不对,错了,最重要的是效率很低。如果有人可以帮助我并告诉我我缺少什么以及推荐/正确的方法,我会很高兴。谢谢!
答案 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
@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);
}
public class Images {
@SerializedName("svg")
public ImagePojo svg;
@SerializedName("png")
public ImagePojo png;
}