Обычно я следую этому подходу, чтобы получить любые сложные классы, преобразованные из json в объект. Этот подход работает почти для всех, таких как список, карта и т. Д. Идея проста - создавать держатели для сложных классов, а затем создавать классы. Дайте столько глубины, сколько потребуется. Хитрость заключается в совпадении имени в Json и ваших держателях (и подклассах).
Файл конфигурации:
class FileConfig{
public String file;
public String owner;
//define toString, getters and setters
}
Метод Класс:
class Method{
public String name;
public String value;
//define toString, getters and setters
}
Метод конфигурации:
class MethodConfig{
List<Method> methods = null;
//define toString, getters and setters
}
Держа Config:
public class HolderConfig {
private FileConfig file = null;
private MethodConfig methods = null;
public FileConfig getFile() {
return file;
}
public void setFile(FileConfig file) {
this.file = file;
}
public MethodConfig getMethods() {
return file;
}
public void setMethods(MethodConfig methods) {
this.methods = methods;
}
}
Создание конфигурации:
public class HolderConfigBuilder {
public static HolderConfig build(JsonObject holderConfigJson) {
HolderConfig configHolderInstance = null;
Gson gsonInstance = null;
gsonInstance = new GsonBuilder().create();
configHolderInstance = gsonInstance.fromJson(holderConfigJson,HolderConfig.class);
return configHolderInstance;
}
}
Демо-класс:
public class App
{
public static void main(String[] args)
{
HolderConfig configHolderInstance = null;
FileConfig file = null;
configHolderInstance = HolderConfigBuilder.build(<Input Json>);
file = configHolderInstance.getFile();
System.out.println("The fileConfig is : "+file.toString());
}
}
Входной JSon:
{ "file": {"file": "foo.c", "owner": "user123"}
"methods": [
{"name": "proc1", "value":"val"},
{"name":"proc2","value":"val2"}
]
}
Примечание: Напишите код, чтобы получить входной JSON в тестовом коде.
Таким образом, всякий раз, когда вы добавляете дополнительные элементы в свой JSON, вам нужно создать отдельный класс для этого элемента и просто добавить имя элемента, как в json, в HolderConfig. Вам не нужно менять остальную часть кода.
Надеюсь, это поможет.
Почему у многих объектов в одном и том же json? это оптимизировать пропускную способность сети? – niceman
Нет, идея состоит в том, что есть несколько компонентов, которые пользователь может определить , например, пользователь идет и определяет методы в одном взаимодействии с системой. В другом пользователь переходит и определяет файл , так что этот json будет построен поэтапно. пользователи идут и выбирают файл, json будет файлом: {data}, methods: empty после того, как пользователь идет и выбирает методы it будут иметь данные Идея состоит в том, что каждый компонент является его собственным классом, и я перейду от классов к json и наоборот – Quantico
, если у вашего json есть предопределенная схема, вы можете объявить один большой класс (или разделить его на базовый класс и подклассы), который содержит все атрибуты, которые вы ожидаете – niceman