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

标签 java json 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);
}

编辑部分还没有写,所以我读完后直接调用写部分。

<小时/>

最佳答案

看看 examples JSON-simple

这里说你需要将对象一一放入数组中,仅使用primitiveString值。您可以使用像 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);

因此,添加您的服务是不允许的,也不会起作用。您应该在其中添加一个 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);

关于java - 如何在 Java 中将 JSONObject 写入其中包含 JSONArray 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19211441/

相关文章:

java - 如何使用扫描仪将对象添加到数组列表?

JavaFX 程序在运行时锁定/卡住

python - [删除]从 JSON 字典中删除一个项目会留下一个空字典 : `{}` . 如何完全删除它?

json - 如何从python3中的json文件中检索所有 "name"和 "id"

javascript - 如何从在 Chart.JS 中运行的 PHP 生成 JSON

java - Web 服务的 JSON 参数

java - 使用 json-simple 库在 Java 中解码 JSON 字符串

Java:如何确定类型是原始类型/包装器/字符串还是其他类型

java - 由于简单的 JSON 依赖而导致 JAR 文件错误

java - iText7 图像透明度