我有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);
}
编辑部分尚未编写,因此我在阅读后直接调用了写作部分。
答案 0 :(得分:5)
查看JSON-simple
的{{3}}。
这里说你需要将对象逐个放入数组中,只使用primitive
和String
值。您可以使用Collections
之类的Map
,String
仅包含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
方法,然后将其转换为fromMap
和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);
,如下所示:
{{1}}
答案 1 :(得分:1)
查看JSONArray Documentation。在这里,您将获得可用方法列表。此JSONArray
继承自java.util.ArrayList
,因此我们可以使用{{1}的可用方法} ArrayList
。
JSONArray
希望这会有所帮助!