이것은 한 번에 처리하는 데 가장 적합한 코드입니다.
MapWrapper
클래스
public class MapWrapper {
private String language;
private Map<String, MyMapEntry> map;
public MapWrapper(String language, Map<String, MyMapEntry> map) {
this.language = language;
this.map = map;
}
}
MyMapEntry
클래스
public class MyMapEntry {
String name;
public MyMapEntry(String name) {
this.name = name;
}
}
사용자 정의 디시리얼라이저
public class MyDeserialiser implements JsonDeserializer<MapWrapper>
{
@Override
public MapWrapper deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext ctx) throws JsonParseException {
JsonObject _global = json.getAsJsonObject();
_global = _global.get("root").getAsJsonObject();
JsonPrimitive lang = (JsonPrimitive) _global.get("language");
JsonElement map = _global.get("map");
Map<String, MyMapEntry> inMap = new LinkedHashMap<String, MyMapEntry>();
for (Entry<String, JsonElement> entry : map.getAsJsonObject()
.entrySet()) {
MyMapEntry _m = new MyMapEntry(entry.getValue().toString());
inMap.put(entry.getKey(), _m);
}
return new MapWrapper(lang.getAsString(), inMap);
}
}
new GsonBuilder().registerTypeAdapter(MapWrapper.class,new MyDeserialiser()).create()
GSON
에 등록 JSON은을 사용하여 루트 요소없이이 JSON에 대한
{"authorization":{"username":"userabc", "password":"passabc"}}
/에서
public class Authorization {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// Add a container for the root element
public static class Container {
public Authorization authorization;
}
}
변환을 DTO를 :
이제 다음 JSON을 고려 코드를
String json; // your jsonString
MapWrapper result = ConvertJsonToObject.getFromJSON(json,MapWrapper.class);
깔끔한 솔루션. +1 –
이 코드는 JSON을 두 번 구문 분석합니다. 그것을 피할 수 있습니까? –
네, 사용자 정의 JsonDeserializer를 작성하고 GSON에 등록하여이 작업을 수행 할 수 있습니다. – Byter