2013-10-06 54 views
3

我有JSON文件,我需要閱讀,編輯並再次寫出。如何在Java中將JSONObject寫入其中包含JSONArray的文件中?

閱讀工作正常,我在數據中與JSON數組的寫入部分鬥爭。

我使用JSON.simple庫在Java中使用JSON。

文件看起來像這樣:

{ 
    "maxUsers":100, 
    "maxTextLength":2000, 
    "maxFileSize":2000, 
    "services": 
    [ 
     { 
      "serviceName":"Яндекc", 
      "className":"YandexConnector.class", 
      "isEnabled":true 
     }, 

     { 
      "serviceName":"Google", 
      "className":"GoogleConnector.class", 
      "isEnabled":false 
     } 
    ] 
} 

當我嘗試寫JSON數據(可變obj)到文件中,services陣列被打破了。我寫代碼:

JSONObject obj = new JSONObject(); 
obj.put("maxUsers", this.getMaxUsers()); 
obj.put("maxTextLength", this.getMaxTextLength()); 
obj.put("maxFileSize", this.getMaxFileSize()); 

JSONArray servicesJSON = new JSONArray(); 
ArrayList<Service> servicesArray = this.getServices(); 
for(int i=0; i< servicesArray.size(); i++) 
{ 
    servicesJSON.add(servicesArray.get(i)); 
} 
obj.put("services", servicesJSON); 


FileWriter file = new FileWriter(filename);     
obj.writeJSONString(file); 
file.flush(); 
file.close(); 

此輸出:

{ 
    "services": 
    [ 
     [email protected], 
     [email protected] 
    ], 
    "maxTextLength":2000, 
    "maxUsers":100, 
    "maxFileSize":2000 
} 

我怎樣才能正確地寫入JSON數據到一個文件,如果我有它在一個JSONArray像services


的代碼,在那裏我從文件中讀取JSON數據(即正常工作):

JSONParser parser = new JSONParser(); 
Object obj = parser.parse(new FileReader(filename)); 
JSONObject jsonObject = (JSONObject) obj; 

setMaxUsers((Long) jsonObject.get("maxUsers")); 
setMaxTextLength((Long) jsonObject.get("maxTextLength")); 
setMaxFileSize((Long) jsonObject.get("maxFileSize")); 
// get all list of services 
JSONArray serv = (JSONArray) jsonObject.get("services"); 

for (int i = 0; i < serv.size(); i++) { 
    JSONObject service = (JSONObject) serv.get(i); 
    Service servec = new Service(); 
    servec.setServiceName((String) service.get("serviceName")); 
    servec.setClassName((String) service.get("className")); 
    servec.setIsEnabled((Boolean) service.get("isEnabled")); 

    services.add(i, servec); 
} 

編輯部分還沒寫,所以我就直接閱讀後調用寫作部分。


+0

編輯部分肯定存在問題,您不會顯示。您將Service類的實例存儲在JSON數組中,而不是存儲JSONObject實例。 –

+0

向我們展示如何創建JSON數據'obj'。 –

+0

@SotiriosDelimanolis,我添加了一部分代碼。你可以看看嗎? –

回答

5

查看JSON-simpleexamples

它在這裏說,您需要將對象逐個放入數組中,僅使用primitiveString值。您可以使用Collections,如Map,它們本身只包含Stringprimitive值。

JSONArray list = new JSONArray(); 
    list.add("foo"); 
    list.add(new Integer(100)); 
    list.add(new Double(1000.21)); 
    list.add(new Boolean(true)); 
    list.add(null); 
    StringWriter out = new StringWriter(); 
    list.writeJSONString(out); 

因此,添加您的Services是不允許的,並且不起作用。您應該在其中添加一個toMap方法,將其轉換爲MapfromMap以將其轉換回來。

像這樣(在Services.java):

public Map toMap() { 
    HashMap<String, String> serviceAsMap = new HashMap<>(); 
    servicesAsMap.put("serviceName", serviceName); 
    servicesAsMap.put("className", this.class.getName() + ".class"); 
    servicesAsMap.put("isEnabled", isEnabled); 
    // ... continue for all values 
    return servicesAsMap; 
} 

,那麼你可以使用該Map來填充JSONArray這樣的:

 JSONArray servicesJSON = new JSONArray(); 
     ArrayList<Service> servicesArray = this.getServices(); 
     for(int i=0; i< servicesArray.size(); i++) 
     { 
      servicesJSON.add(servicesArray.get(i).toMap()); // use the toMap method here. 
     } 
     obj.put("services", servicesJSON); 
+0

非常感謝!它解決了我的問題) –

0

看一看JSONArray Documentation。在這裏,你會得到清單可用的方法。這JSONArray繼承自java.util.ArrayList,所以我們可以使用可用的方法ArrayListJSONArray

JSONArray userList = JSONFile.readJSONArray("users.json"); 
JSONArray newuserList = new JSONArray() ; 
JSONObject jsonobject , newjsonObject; 
      for (int i = 0; i < userList.size(); i++) { 
       jsonobject = (JSONObject) userList.get(i); 

       String id = (String) jsonObject.get("id"); 
       String pass = (String) jsonObject.get("password"); 
       newuserList.add(jsonObject); 
// Here we are putting json object into newuserList which is of JSONArray type 
      try{ 
       FileWriter file = new FileWriter("/users.json",false); 

       newuserList.writeJSONString(newuserList, file); 
       file.close(); 
      } 
      catch(Exception e ){ 

       e.getMessage(); 

      } 

希望這會有所幫助!

相關問題