簡體   English   中英

如何在Java中將JSONObject寫入其中包含JSONArray的文件?

[英]How to write a JSONObject to a file, which has JSONArray inside it, in Java?

我有JSON文件,需要再次讀取,編輯和寫出。

讀取工作正常,我在數據中處理JSON Array的寫入部分時遇到困難。

我使用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":
    [
        translator.settings.Service@121c5df,
        translator.settings.Service@45f4ae
    ],
    "maxTextLength":2000,
    "maxUsers":100,
    "maxFileSize":2000
}

如果我在類似services的JSONArray中存儲JSON數據,如何將其正確寫入文件中?


我從文件中讀取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);
}

編輯部分尚未編寫,因此我在閱讀后立即調用書寫部分。


看一下JSON-simple示例

它在這里說,您需要僅使用primitive值和String值將對象一一放入數組中。 您可以使用像Map這樣的Collections ,它們本身僅包含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方法,將其轉換為Map然后從fromMap轉換回Map

像這樣(在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);

看一下JSONArray 文檔。在這里,您將獲得可用的方法列表。此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();

            }

希望這會有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM