如何更改.JSON文件中的某些值,然后在保持JSON格式的同时将其写回? (Java)的

时间:2015-05-05 15:37:12

标签: java json mongodb

JSON示例文件包含:

{
    "1st_key": "value1",
    "2nd_key": "value2",
    "object_keys": {
        "obj_1st": "value1",
        "obj_2nd": "value2",
        "obj_3rd": "value3",
    }
}

我使用此StringBuilder方法将JSON文件读入String,以便将新行添加到字符串本身中。所以String看起来与上面的JSON文件完全相同。

public String getJsonContent(String fileName) {       
        StringBuilder result = new StringBuilder("");
        File file = new File(fileName);
        try (Scanner scanner = new Scanner(file)) {
              while (scanner.hasNextLine()) {
                    String line = scanner.nextLine();
                    result.append(line).append("\n");
              }
              scanner.close();
        } catch (IOException e) {
              e.printStackTrace();
        }
        return result.toString();     
    }

然后我使用MongoDB API(使用DBObject,BasicDBObject和util.JSON)将JSON文件转换为Object,然后调出我需要更改的Object部分,即'object_keys':

File jsonFile = new File(C:\\example.json);
String jsonString = getJsonContent(jsonFile.getAbsolutePath());
DBObject jsonObject = (DBObject)JSON.parse(jsonString);
BasicDBObject objectKeys = (BasicDBObject) jsonObject.get("object_keys");

现在我可以使用PUT方法将新值写入Object:

objectKeys.put("obj_1st","NEW_VALUE1");
objectKeys.put("obj_2nd","NEW_VALUE2");
objectKeys.put("obj_3rd","NEW_VALUE3");

!以下部分不需要,请查看下面的答案。

在我更改了对象后,我需要将其写回json文件,因此我需要将Object转换为String。有两种方法可以做到这一点,其中一种方法都有效。

  String newJSON = jsonObject.toString();
or
  String newJSON = JSON.serialize(jsonObject);

然后我使用PrintWriter将内容写回文件

PrintWriter writer = new PrintWriter(C:\\example.json)
writer.print(newJSON);
writer.close();

我现在面临的问题是写入的字符串是一行,没有格式化。在某个地方,它失去了所有新行。所以它基本上是这样的:

{"1st_key": "value1","2nd_key": "value2","object_keys": { "obj_1st": "NEW_VALUE1","obj_2nd": "NEW_VALUE2","obj_3rd": "NEW_VALUE3", }}

我需要以与开头所示相同的格式编写JSON文件,保留所有制表,空格等。

这有可能吗?

3 个答案:

答案 0 :(得分:0)

当你想要按照你所说的方式格式化某些内容时,它会以漂亮/漂亮的方式写入文件。例如:输出漂亮的json。快速搜索谷歌找到了我认为可以解决您的问题。

Solution

答案 1 :(得分:0)

您将不得不使用某种类型的json解析器。我个人更喜欢org.json,如果您正在操作json数据,我会推荐它,但您也可能喜欢json-io,这对于没有外部依赖性的json序列化非常有用。

使用json-io,它就像

一样简单
String formattedJson = JsonWriter.formatJson(jsonObject.toString())

使用org.json,您只需将int传递给toString方法。

答案 2 :(得分:0)

感谢Saraiva,我发现了一个令人惊讶的简单解决方案,谷歌搜索“漂亮的印刷JSON”并使用了Google GSON library。我下载了.jar并将其添加到Eclipse中的项目中。

这些是我需要的新进口商品:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

由于我之前的代码已经可以使用JSON对象( jsonObject ),所以我只需要添加两行:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String newJSON = gson.toJson(jsonObject);

现在,当我使用writer.print(newJSON);时,它将以正确的格式编写JSON,格式精美且缩进。