2013-12-16 20 views
2

好吧,我正在創建一個使用JSON保存日期的應用程序。我使用GSON作爲我的JSON「處理器」。我想知道如何使用Gson。我遵循網絡上的教程。問題是,Web上的教程只保存「一個」json數據。我的意思是,例如,Java - Multiple GSON?

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

於是,經過用戶保存數據1,他們希望保存數據2,數據3,等等這樣

{ 
    "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

好像一個'Map '在這裏就可以工作。 –

回答

0

將數據作爲對象。

設置其值並將其保存在ArrayList中。

轉換ArrayList中,以JSON

+1

這會給一個JSON數組。 OP有一個JSON對象。 –

+0

TBH,它看起來像OP會更好地使用一個對象數組,並且簡單地說就是這樣,因爲他沒有意識到差異。 – tom

+0

@tom這並沒有使這個答案正確。 –

1

您必須使用JSON解析器/發電機之前瞭解您所使用的JSON。

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

是含有JSON對象具有名稱Data1 JSON對象。

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

是含有名爲Data1Data2 2個JSON對象JSON對象。

簡單的工作的例子是

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 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對象的值,可以是數字,字符串,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將加載它,你可以從中提取名爲data1的JSON對象。

+0

我編輯我的問題。 – Jeremy

+0

@jeremy這取決於。如果這100多個json對象具有相同的格式,則只需要一個類(加上任何嵌套)。嘗試使用超過2個json對象的代碼。然後用json數組做一個例子。 –

+0

不,您的代碼不起作用。我之前嘗試過。它會將舊的json數據替換爲新的json數據。 – Jeremy

0

由於索蒂里奧斯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的實例。 –