如何正确创建json文件

时间:2015-09-14 06:55:34

标签: java json gson

所以我在正确创建Json文件时遇到了麻烦。 是)我有的: 1. Gson libs 2.试着在Json中写一个像这样的新用户:

public static void writeUserBD(String name, String surname, int age) {
        //writing in a Json format

        JSONObject writeOne = new JSONObject();
        JSONArray arr = new JSONArray();

        for(int i = 0; i< arr.size() ; i++)
        {
            writeOne.put("name", name);
            writeOne.put("surname", surname);
            writeOne.put("age", new Integer(age));
            arr.add(writeOne);
            writeOne = new JSONObject();

        }
        //creating dir&file and writing in it
        try {
            File dir = new File("Test");
            dir.mkdir();
            File f = new File("Test/TestUser.json");
            if (!dir.exists()) {
                dir.mkdirs();
            } else if (!f.exists()) {
                f.createNewFile();
            }
            //here comes writing encoding problem ! ! !
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f.getAbsoluteFile(), true), Charset.forName("UTF-8")));
            try {
                bw.write(arr + " " + "\n");
            } finally {
                bw.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

但如果我重新加载我的应用程序并尝试编写一个新应用程序,它将编写一个新的JSONObject,我的输出如下:

[{}]
[{}]

在这种情况下,我无法解析我的json文件(用于创建简单的登录)我得到的错误如"unexcpected token [[]"正如我所理解的那样,这是因为文件中有超过1个jsonobject。

所以我的问题是:如何以正确的格式在json文件中编写新用户数据(即使重新加载应用),我可以使用/例如[{},{},{}]

2 个答案:

答案 0 :(得分:1)

尝试

new FileOutputStream(f.getAbsoluteFile(), false) 

true参数追加到当前文件,false应该创建一个新参数

答案 1 :(得分:0)

您的代码输出应该是一个空数组,因为您从不向数组添加元素。 您创建一个新数组并迭代它。但是一个新的数组没有元素,因此里面的代码也没有 循环永远不会被执行。除此之外,您只想添加一个新用户 ,因此您不需要循环。

您应首先阅读该文件,然后将新用户添加到该文件并将其写回。我为你创建了一个简单的例子。 我之前没有使用过GSON,所以我确信有更好的方法可以做到这一点,但它确实有效。 我使用了try-with-resource功能和Java 7的新IO API,并且没有进一步处理异常。所以如果你想处理异常 在方法内部相应地更改代码。我没有创建文件结构,所以你也应该自己创建。

public static void writeUserBD(final String name, final String surname, final int age) throws IOException {
    final Path jsonFile = Paths.get("Test/TestUser.json");
    final JsonArray users = new JsonArray();

    // Read all existing users
    if (Files.isRegularFile(jsonFile)) {
        try (final JsonReader r = new JsonReader(Files.newBufferedReader(jsonFile))) {
            r.beginArray();

            while (r.hasNext()) {
                final JsonObject user = new JsonObject();

                r.beginObject();
                r.nextName();
                user.addProperty("name", r.nextString());
                r.nextName();
                user.addProperty("surname", r.nextString());
                r.nextName();
                user.addProperty("age", r.nextInt());
                r.endObject();
                users.add(user);
            }

            r.endArray();
        }
    }

    // Create the new user
    final JsonObject user = new JsonObject();

    user.addProperty("name", name);
    user.addProperty("surname", surname);
    user.addProperty("age", age);
    users.add(user);

    // Write all users
    try (final BufferedWriter w =
            Files.newBufferedWriter(jsonFile, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
        w.write(users.toString());
    }
}