2013-12-16 3 views
2

ОК, я создаю приложение, которое использовало JSON, чтобы сохранить дату. Я использовал GSON как мой JSON «процессор».Java - Несколько GSON?

Да, я знаю, как использовать Gson. Я следую учебнику в Интернете. Проблема в том, что учебник по сети и сохранить только «одни» данные json. Я имею в виду, например,

{ 
    "Data1": { 
     "name": "Data1", 
     "info": "ABCDEFG" 
    } 
} 

Таким образом, после того, как пользователь спас Data1, они хотят, чтобы сохранить Data2, Data3 и т.д., как этот

{ 
    "Data1": { 
     "name": "Data1", 
     "info": "ABCDEFG" 
    }, 
    "Data2": { 
     "name": "Data2", 
     "info": "ABCDEFGHIJ" 
    } 
} 

Но если пользователь хочет сохранить данные 100+ ли я сделать 100 классов? Ниже мой код.

JSONTest.class

public class JSONTest 
{ 
    private static Gson gson; 
    private static File file; 
    private static JSONTest instance; 
    private static Bean bean; 
    private static Map<String, String> data = new HashMap(); 

    public static void main(String[] args) 
    { 
     bean = new Bean(); 
     File file = new File("C://test-json.json"); 
     GsonBuilder builder = new GsonBuilder(); 
     builder.setPrettyPrinting(); 
     gson = builder.create(); 

     data.put("name", "data1"); 
     data.put("info", "abcde"); 
     bean.setData(data); 


     String jsonString = gson.toJson(bean); 

     try 
     { 
      FileWriter fw = new FileWriter(file); 
      fw.write(jsonString); 
      fw.close(); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Bean.class

public class Bean 
{ 
    private Map<String, String> data; 

    public Map<String, String> getData() 
    { 
     return data; 
    } 

    public void setData(Map<String, String> properties) 
    { 
     this.data = properties; 
    } 
} 

Так что результат этот

{ 
    "data": { 
    "name": "data1", 
    "info": "abcde" 
    } 
} 

ок теперь я изменить значение (означает, что я хочу, чтобы добавить новый данные

data.put("name", "data2"); 
data.put("info", "abcdef"); 
bean.setData(data); 

результат этого

{ 
    "data": { 
    "name": "data2", 
    "info": "abcdef" 
    } 
} 

, но я хочу, чтобы результат, как этот

{ 
    "data1": { 
     "name": "data1", 
     "info": "abcde" 
    }, 
    "data2": { 
     "name": "data2", 
     "info": "abcdef" 
    } 
} 

Так что мой вопрос, как я могу это сделать? Если пользователь хочет сохранить данные 100+ сделать я должны сделать 100 + классы или элементы? А также, как добавить «selectedData: "data1"», поэтому мой загрузчик json так загружает только 1 данные?

+2

Кажется, что это «Карта » будет работать здесь. –

ответ

0

Сделайте данные как объект.

Задайте свои значения и сохраните их в ArrayList.

Преобразовать ArrayList в JSON

+1

Это даст массив JSON. OP имеет объект JSON. –

+0

TBH, похоже, что OP будет лучше использовать массив объектов и просто сделал это так, потому что он не понимает разницы. – tom

+0

@tom Это не делает правильный ответ. –

1

Вы должны понять JSON, который вы используете, прежде чем использовать JSON парсер/генератор.

Этот

{ 
    "Data1": { 
     "name": "Data1", 
     "info": "ABCDEFG" 
    } 
} 

представляет собой объект JSON, содержащий объект JSON с именем Data1.

Этот

{ 
    "Data1": { 
     "name": "Data1", 
     "info": "ABCDEFG" 
    }, 
    "Data2": { 
     "name": "Data2", 
     "info": "ABCDEFGHIJ" 
    } 
} 

представляет собой объект JSON, содержащий два объекта JSON с именем Data1 и Data2.

Простой рабочий пример будет

public static void main(String[] args) throws Exception { 
    String json = "{    \"Data1\": {     \"name\": \"Data1\",    \"info\": \"ABCDEFG\"    },    \"Data2\": {     \"name\": \"Data2\",    \"info\": \"ABCDEFGHIJ\"    }   }"; 
    Gson gson = new Gson(); 
    Map<String, CustomBean> objects = gson.fromJson(json, new TypeToken<Map<String, CustomBean>>() {}.getType()); 
    System.out.println(objects); 
} 

где CustomBean является

public class CustomBean { 

    private String name; 
    private String info; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getInfo() { 
     return info; 
    } 

    public void setInfo(String info) { 
     this.info = info; 
    } 

    public String toString() { 
     return "[name = " + name + ", info = " + info + "]"; 
    } 

} 

Вышеприведенные печатает

{Data1=[name = Data1, info = ABCDEFG], Data2=[name = Data2, info = ABCDEFGHIJ]} 

Так как вложенные объекты одинаковы, вы можете сказать, Gson в десериализовать их в Map wher e именем объекта JSON является ключ, а сам объект является значением.

JSON format имеет очень специфические типы, которые могут отображаться на типы Java. Вы должны использовать соответствующие типы. Например, вы должны использовать List для массива JSON.


Давайте вернемся к вашему вопросу теперь, когда вы изменили его

Так что мой вопрос, как я могу это сделать? Если пользователь хочет сохранить данные 100+ делать я должен сделать 100 + классы или элементы? А также, как добавить "selectedData:" data1 "" так что мой загрузчик json так загружает только 1 данные?

С примером, который вы указали, мне кажется, что вы неправильно понимаете, как работает Gson.

Gson пытается сериализовать объект объекту JSON. Объект простого класса, как

public class Bean { 
    private String name = "some value"; 
    private String info = "some other value"; 
} 

карта приятно следующего объект JSON

{ 
    "name" : "some value", 
    "info" : "some other value" 
} 

Java-класс Map специальный класс, который отображает красиво JSON. Ключ используется как имя объекта JSON, а значение используется как значение объекта JSON, будь то число, массив String, JSON или другой объект JSON. Таким образом, Map объект в следующем фрагменте

Map<String, Bean> map = new HashMap<>(); 
map.put("data1", new Bean()); 

сериализуются Gson будет давать следующие JSON

{ 
    "data1": { 
     "name": "some value", 
     "info": "some other value" 
    } 
} 

Поскольку ключ является Stringdata1 и значение другой объект JSON, который сериализовать как я показал выше.

Так что мой вопрос, как я могу это сделать? Если пользователь хочет сохранить данные 100+ делать я должен сделать 100 + классы или элементы?

Должно быть ясно из вышесказанного, что вам нужно сделать.

А также, как добавить "selectedData: "data1"" это только мой загрузчик так JSON нагрузка 1 данные?

Просьба уточнить, что вы имеете в виду. Вы не можете загрузить только подмножество JSON. Gson загрузит все это, вы можете извлечь из него объект JSON с именем data1.

+0

Я редактирую свой вопрос. – Jeremy

+0

@jeremy Это зависит от многого. Если эти 100+ json-объекты имеют одинаковый формат, вам нужен только один класс (плюс любой вложенный). Попробуйте код, который я предложил с более чем двумя объектами json. Затем сделайте пример с json-массивом. –

+0

Нет, ваш код не работает. Я попробовал это раньше. Он заменит старые данные json на новые данные json. – Jeremy

0

Как Sotirios Delimanolis сказал вы хотите карту т.е.

public class Data { 

    private final String name; 
    private final String info; 

    public Data(String name, String info) { 
     this.name = name; 
     this.info = info; 
    } 

    public String getInfo() { 
     return info; 
    } 

    public String getName() { 
     return name; 
    } 
} 

Тогда десериализации к карте. то есть

Gson gson = new Gson();    

    Type collectionType = new TypeToken<Map<String, Data>>(){}.getType(); 
    Map<String, Data> datas = gson.fromJson(json, collectionType); 

    Data data1 = datas.get("data1"); 
+0

Я редактирую свой вопрос. – Jeremy

+0

Вам не нужно будет создавать 100 классов, у вас будет всего 100 экземпляров класса Data. –

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