简体   繁体   English

如何在Java中将JSONObject写入其中包含JSONArray的文件?

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

I have JSON file, that I need to read, edit and write out again. 我有JSON文件,需要再次读取,编辑和写出。

Reading works fine, I struggle with the write part of the JSON Array in my data. 读取工作正常,我在数据中处理JSON Array的写入部分时遇到困难。

I use JSON.simple library to work with JSON in Java. 我使用JSON.simple库在Java中使用JSON。

The file looks like this: 该文件如下所示:

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

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

When I try to write JSON-data (variable obj ) to file, the services array is broken. 当我尝试将JSON数据(变量obj )写入文件时, services数组损坏。 My writing code: 我的写作代码:

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();

This outputs: 输出:

{
    "services":
    [
        translator.settings.Service@121c5df,
        translator.settings.Service@45f4ae
    ],
    "maxTextLength":2000,
    "maxUsers":100,
    "maxFileSize":2000
}

How can I write the JSON data correctly to a file, if I have it in a JSONArray like services ? 如果我在类似services的JSONArray中存储JSON数据,如何将其正确写入文件中?


The code, where I read the JSON data from the file (that works fine): 我从文件中读取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);
}

The editing part is not yet written, so I call the writing part directly after the reading. 编辑部分尚未编写,因此我在阅读后立即调用书写部分。


Have a look at the examples of JSON-simple . 看一下JSON-simple示例

It says here that you need to put the Objects one by one into the Array, using only primitive and String values. 它在这里说,您需要仅使用primitive值和String值将对象一一放入数组中。 You may use Collections like Map that by themselves only contain String or primitive values. 您可以使用像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);

So, adding your Services is not allowed and won't work. 因此,不允许添加您的Services ,也将无法使用。 You should add a toMap method in it where you convert it to a Map and fromMap to convert it back. 您应该在其中添加toMap方法,将其转换为Map然后从fromMap转换回Map

Like this (in Services.java ): 像这样(在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;
 }

then you can use that Map to populate your JSONArray like this: 那么您可以使用该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);

Have a look at JSONArray Documentation .Here you will get list of methods available.This JSONArray is inherited from java.util.ArrayList ,so we can use the methods available for ArrayList to JSONArray . 看一下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();

            }

Hope this will help ! 希望这会有所帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM