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

时间:2013-10-06 16:59:57

标签: java json jsonobject json-simple

我有JSON文件,我需要再次阅读,编辑和写出。

阅读工作正常,我在数据中遇到了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":
    [
        translator.settings.Service@121c5df,
        translator.settings.Service@45f4ae
    ],
    "maxTextLength":2000,
    "maxUsers":100,
    "maxFileSize":2000
}

如果我将JSON数据正确地写入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);
}

编辑部分尚未编写,因此我在阅读后直接调用了写作部分。


2 个答案:

答案 0 :(得分:5)

查看JSON-simple的{​​{3}}。

这里说你需要将对象逐个放入数组中,只使用primitiveString值。您可以使用Collections之类的MapString仅包含primitive 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方法,然后将其转换为fromMapServices.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); ,如下所示:

{{1}}

答案 1 :(得分:1)

查看JSONArray Documentation。在这里,您将获得可用方法列表。此JSONArray继承自java.util.ArrayList,因此我们可以使用{{1}的可用方法} ArrayList

JSONArray

希望这会有所帮助!