2016-07-06 4 views
3

У меня есть следующие JSONGSON с несколькими известными классами

{ "file": {"file": "foo.c", "owner": "user123"} 
    "methods": [{"name": "proc1", "value":"val"}, {"name":"proc2","value":"val2"}] 
    etc... 
} 

Я знаю, что я могу сделать что-то вроде

class file{ 
     public String file 
     public String owner 
    } 
class methods{ 
     public String name 
     public String value 
    } 

и я могу либо вызвать

File file= gson.fromJson(jsonInString, File.class); 
methods[] array = gson.fromJson(jsonInString, methods[].class); 

но что делать Я, если мне нужно обработать сложный json, который содержит много объектов, все togther Я не могу указать gson.fromJson(jsonInString, ListOfClasses)

+0

Почему у многих объектов в одном и том же json? это оптимизировать пропускную способность сети? – niceman

+0

Нет, идея состоит в том, что есть несколько компонентов, которые пользователь может определить , например, пользователь идет и определяет методы в одном взаимодействии с системой. В другом пользователь переходит и определяет файл , так что этот json будет построен поэтапно. пользователи идут и выбирают файл, json будет файлом: {data}, methods: empty после того, как пользователь идет и выбирает методы it будут иметь данные Идея состоит в том, что каждый компонент является его собственным классом, и я перейду от классов к json и наоборот – Quantico

+1

, если у вашего json есть предопределенная схема, вы можете объявить один большой класс (или разделить его на базовый класс и подклассы), который содержит все атрибуты, которые вы ожидаете – niceman

ответ

1

Обычно я следую этому подходу, чтобы получить любые сложные классы, преобразованные из 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. Вам не нужно менять остальную часть кода.

Надеюсь, это поможет.

Смежные вопросы